如果在其中启动新线程,则何时返回该方法

时间:2013-02-22 19:05:18

标签: c#

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

public SomeMethod() {

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

   return SomeValue;
}

如果SomeOtherMethod被调用并在新线程中启动,a)SomeMethod是否等到该线程在返回之前完成运行或b)方法返回,然后是{{1}的线程即使在SomeOtherMethod返回之后,还是继续自己继续?

我问的原因是我需要等到所有SomeMethod完成才退出SomeMethod。

感谢。

2 个答案:

答案 0 :(得分: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本身不会阻止,但会返回一个任务,该任务在所有其他人都拥有时完成。 (注意全部和等待所有这里 - 完全不同的方法之间的区别!)

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

答案 1 :(得分:2)

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

E.G。

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

        Task.WaitAll(tasks.ToArray());