作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
很抱歉提出了一个多余的问题。但是,我找到了很多解决问题的方法,但没有一个得到很好的解释。我希望在这里能清楚地说明这一点。
我的 C# 应用程序的主线程使用线程池生成 1..n 个后台工作程序。我希望在所有工作人员完成之前锁定原始线程。我特别研究了 ManualResetEvent,但我不清楚它的用途。
伪:
foreach( var o in collection )
{
queue new worker(o);
}
while( workers not completed ) { continue; }
如有必要,我会事先知道即将排队的 worker 数量。
最佳答案
试试这个。该函数接收一个 Action 委托(delegate)列表。它将为列表中的每个项目添加一个 ThreadPool worker 条目。它将等待每个操作完成后再返回。
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);
}
关于c# - 等待池线程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540078/
我是一名优秀的程序员,十分优秀!