gpt4 book ai didi

c# - 如何使此循环的主体在 C# 中并行运行

转载 作者:行者123 更新时间:2023-11-30 21:23:45 25 4
gpt4 key购买 nike

我有一个这样的循环

ICollection<Data> GetData()
{
ICollection<Data> result = new List<Data>()
foreach (var item in aCollection)
item.AddData(result);
return result;
}

我现在需要它并行执行而不是迭代执行。我的第一次尝试是做这样的事情

ICollection<Data> GetData()
{
ICollection<Data> result = new SynchronizedCollection<Data>()
foreach (var item in aCollection)
new Thread(delegate() { item.AddData(result); }).Start();
return result;
}

但我需要一种方法来等待所有数据添加完毕后再返回结果。

最简单的方法是什么?

编辑 AddData 将通过网络调用。在集合中通常最多有几十个条目。

最佳答案

您可以使用并行扩展,它将集成到 C# 4.0 中,并可作为单独的库用于 C# 3.5,您可以在此处下载:Microsoft Parallel Extensions to .NET Framework 3.5 .

如果您不想使用 Parallel Extensions,请不要在每次迭代时都启动一个线程,而是使用 ThreadPool,这样可以获得更好的性能。

正如我在这个答案的评论中了解到的那样,List<> 不是线程安全的,为什么您应该改用 SynchronizedCollection<>。

这是一个使用线程池的代码示例。

        IEnumerable<object> providers = null;

var waitHandles = new List<WaitHandle>();
foreach (var provider in providers)
{
var resetEvent = new ManualResetEvent(false);
waitHandles.Add(resetEvent);

ThreadPool.QueueUserWorkItem(s =>
{
// do whatever you want.
((EventWaitHandle)s).Set();
}, resetEvent);
}

WaitHandle.WaitAll(waitHandles.ToArray());

关于c# - 如何使此循环的主体在 C# 中并行运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com