我想知道,当所有的线程在多线程程序等待多个后台线程
已完成不一样的东西汇集
while(!allThreadFinished){
thread.sleep(100);
}
的解决方案应该用监视器,但我不能我怎么能批准它是正确的。 由于以下代码中的“SomeMethod”使用网络,因此会消耗时间。
public object SomeMethod(string input);
public object[] MultiThreadMethod(string[] inputs) {
var result = new object[inputs.Count()];
int i = 0;
foreach (var item in inputs) {
BackgroundWorker work = new BackgroundWorker();
work.DoWork += (sender, doWorkEventArgs) => { doWorkEventArgs.Result = SomeMethod(item); };
work.RunWorkerCompleted += (sender, runWorkerCompletedEventArgs) => {
result[i] = runWorkerCompletedEventArgs.Result;
};
i++;
work.RunWorkerAsync();
}
/////////////////////////////////////////////////////////////
//**wait while all thread has been completed**
/////////////////////////////////////////////////////////////
return result;
}
由于您使用'BackgroundWorker'一定意味着你是在GUI环境中,在这种情况下,你不应该阻止,直到他们全部完成,你应该继续上一旦完成,只需运行一些代码即可。要么是这样,要么你不在UI环境中(或者已经在后台线程中),在这种情况下,你不应该在这里使用BackgroundWorker。 – Servy
你的意思是使用Thread更好? – Ali
嗯,这取决于。你是否在GUI环境中?此方法是否从UI线程运行?如果是这样,你应该不会被阻止,你应该创建后台任务,然后在完成所有代码时执行一些代码。如果您不在UI线程中并且确实需要阻止,那么您应该使用'Task'而不是BackgroundWorkers(或线程)。 – Servy