如果我使用System.Threading.Task
来运行这样的并行任务:
Func<MyResult> func=ComputeResult;
var t = Task.Facroty.StartNew<MyResult>(ComputeResult, 1);//1 is some id
t.Wait();
var tt = Task.Facroty.StartNew<MyResult>(ComputeResult, 2);
tt.Wait();
t.Wait()
会阻止下一个声明。
如果我在一个循环中开始几个任务并且想要以一种方式等待它们,使得循环内的任务不会相互阻塞,但是循环后的语句被阻止。
我正在使用以下构造:
var tasks=new List<Task<MyResult>>();
Func<MyResult> func=ComputeResult;
for(int i=0; i<10;i++)
{
var t=Task.Facroty.StartNew<MyResult>(ComputeResult, i);
tasks.Add(t);
//t.Wait(); //SHOULD I CALL WAIT HERE?
}
//OR THIS BETTER OR EVEN IF THIS WORKS
foreach(var t in tasks)
{
t.Wait();
}
//do other stuff
编辑: - 在最终形式中,我使用的是以下行,而不是最后一个foreach
循环。
Task.WaitAll(tasks.ToArray());
答案 0 :(得分:1)
怎么样:
Task.WaitAll(
Enumerable
.Range(1, 10)
.Select(x => Task.Factory.StartNew(arg =>
{
// Do the task here
// arg will obviously be the state object x
// which will range from 1 to 10
}, x))
.ToArray()
);