我很抱歉问了一个多余的问题。然而,我找到了许多解决我的问题的方法,但没有一个得到很好的解释。我希望在这里能说清楚。
我的 C# 应用程序的主线程使用线程池生成 1..n 个后台工作人员。我希望原始线程锁定,直到所有工作人员完成为止。我特别研究了 ManualResetEvent,但我不清楚它的用途。
伪:
foreach( var o in collection )
{
queue new worker(o);
}
while( workers not completed ) { continue; }
如果有必要,我会提前知道即将排队的工人数量。
尝试这个。该函数接受一个 Action 委托列表。它将为列表中的每个项目添加一个 ThreadPool 工作条目。它将等待每个操作完成后再返回。
public static void SpawnAndWait(IEnumerable<Action> actions)
{
var list = actions.ToList();
var handles = new ManualResetEvent[actions.Count()];
for (var i = 0; i < list.Count; i++)
{
handles[i] = new ManualResetEvent(false);
var currentAction = list[i];
var currentHandle = handles[i];
Action wrappedAction = () => { try { currentAction(); } finally { currentHandle.Set(); } };
ThreadPool.QueueUserWorkItem(x => wrappedAction());
}
WaitHandle.WaitAll(handles);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)