0

假设我有一些看起来像这样的代码:

public SomeMethod() {

   foreach (x...)
   {
     if (SomeCondition)
     {
        var SomeVariable = x;
        Task.Factory.StartNew(() => SomeOtherMethod(SomeVariable));
     }
   }

   return SomeValue;
}

如果SomeOtherMethod在一个新线程中被调用并启动,是否 a)SomeMethod等到该线程完成运行后再返回,或者 b) 方法返回,然后线程在返回SomeOtherMethod后仍自行继续SomeMethod

我问的原因是我需要等到全部SomeOtherMethods完成后再退出 SomeMethod。

谢谢。

4

2 回答 2

5

收集一个集合中的所有任务,然后调用Task.WaitAll它:

List<Task> tasks = new List<Task>();
foreach (x...)
{
    if (SomeCondition)
    {
        var someVariable = x;
        tasks.Add(Task.Factory.StartNew(() => SomeOtherMethod(someVariable));
     }
}
Task.WaitAll(tasks.ToArray());

请注意,在 .NET 4.5 中编写异步方法时,您将使用:

await Task.WhenAll(tasks);

因为Task.WhenAll它本身不会阻塞,而是返回一个任务,该任务在所有其他任务完成时完成。(注意这里的When All和Wait All之间的区别-非常不同的方法!)

(此外,您可以使用 .NET 4.5Task.Run代替Task.Factory.StartNew,只是为了方便。)

于 2013-02-22T19:13:53.490 回答
2

Task.WaitAll可用于跟踪并等待所有任务完成。StartNew 返回一个任务。跟踪数组中的所有返回值并将其传递给 WaitAll。

例如

        List<Task> tasks = new List<Task>();
        while (condition)
        {
            if (true)
            {                    
                Task temp = Task.Factory.StartNew(() => 0);
                tasks.Add(temp);
            }
            //...
        }

        Task.WaitAll(tasks.ToArray());
于 2013-02-22T19:13:23.763 回答