我在 Asp.net C#、.net 3.5 中遇到问题
我有下面的代码:
List<object> objectList = new List<object>();
foreach(var item in listItem)
{
object obj = getData (item);
objectList.add(obj);
}
Console.Write("Finish all");
每次 getData (item);
触发大约需要 1 秒;
我想让 ListItem
中的所有项目同时运行(这里是 getData(item)
),然后在 foreach 完成 Console.write 后执行(“全部完成”)
。
我该怎么做? 任何想法将不胜感激!
最佳答案
您可以使用 ThreadPool和 ManualResetEvent :
int itemCount = listItem.Length;
List<object> objectList = new List<object>();
ManualResetEvent[] resetEvents = new ManualResetEvent[itemCount];
for (int i = 0; i < itemCount; i++)
{
var item = listItem[i];
resetEvents[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback((object index) =>
{
object obj = getData(item);
lock (objectList)
objectList.add(obj);
resetEvents[(int)index].Set();
}), i);
}
WaitHandle.WaitAll(resetEvents);
Console.Write("Finish all");
ThreadPool 将在后台运行任务,当前线程将等待所有 worker 完成 ManualResetEvent。
关于c# - 异步添加元素到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14517210/