我在这段代码中遇到了一些关于线程的问题。
我想要同时运行很多任务,并在所有任务都执行完毕后继续。
while (true)
{
// Run tasks together:
foreach (object T in objectsList)
{
if (T.something>0)
var task = Task.Factory.StartNew(() => T.RunObject());
task.ContinueWith(delegate { ChangeObject(T, 1); }, TaskContinuationOptions.NotOnFaulted);
}
// <-- Here I want to wait for all the task to be finish.
// I know its task.Wait() but how to waitAll()?
System.Threading.Thread.Sleep(this.GetNextTime());
var RefreshObjects = new Task(loadObjectsList); RefreshObjects .Start(); RefreshObjects.Wait();
}
我不知道 objectsList
中会有多少对象,也不知道 T.something
是否大于 0。因此我不能简单地使用以下方法:
Task[] Tasks = new Task[objectsList.count()]
for (int T=0; T<objectsList.count(); ++T)
{
if (objectsList[T].something>0)
var task = Task.Factory.StartNew(() => objectsList[T].RunObject());
task.ContinueWith(delegate { ChangeObject(objectsList[T], 1); }, ...);
}
Task.WaitAll(Tasks);
因为在
objectsList[T].something!>0
时,Tasks
将包含空值......谢谢任何建议!
ContinueWith
而不将其分配给变量来轻松避免使select
语句成为委托。 - Servy