如果在方法内部启动了新线程,则该方法何时返回

本文关键字:方法 何时 返回 线程 内部 启动 如果 新线程 | 更新日期: 2023-09-27 18:00:31

假设我有一些代码如下所示:

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

如果SomeOtherMethod在一个新线程中被调用并启动,a)SomeMethod是等到该线程完成运行后才返回,还是b)方法返回,然后SomeOtherMethod的线程即使在SomeMethod返回后也只能自己继续?

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

谢谢。

如果在方法内部启动了新线程,则该方法何时返回

收集集合中的所有任务,然后对其调用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本身不阻塞,而是返回一个在所有其他任务都阻塞时完成的任务。(请注意WhenAll和WaitAll之间的区别-非常不同的方法!)

(另外,在.NET 4.5中,为了方便起见,您可以使用Task.Run而不是Task.Factory.StartNew。)

任务。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());