好的,我应该已经知道了答案,但是......
我想在一个单独的线程上并行执行许多不同的任务,并在继续之前等待所有线程的执行完成。我知道我可以使用ThreadPool.QueueUserWorkItem()
或BackgroundWorker
但不想使用(无特殊原因)。
下面的代码是否正确地在后台线程上并行执行任务并等待它们完成处理?
Thread[] threads = new Thread[3];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(SomeActionDelegate);
threads[i].Start();
}
for (int i = 0; i < threads.Length; i++)
{
threads[i].Join();
}
我知道这个问题肯定已被问过100次,所以感谢你的回答和耐心。
答案 0 :(得分:4)
是的,这是一种正确的方法。但是如果SomeActionDelegate
相对较小,则创建3个线程的开销将很大。这就是为什么你们probaly应该使用ThreadPool。即使它没有相当于Join的干净。
在与GUI交互时,BackgroundWorker非常有用。
答案 1 :(得分:1)
总是很难说“正确”的方式是什么,但你的方法确实有效。
但是,通过使用Join
,UI线程(如果主线程是UI线程)将被阻止,从而冻结UI。如果不是这样,那么即使它有不同的问题(可伸缩性/并发线程数等),你的方法也基本没问题。
答案 2 :(得分:1)
如果您(或将使用.Net 4.0)尝试使用Task parallel Library