Cri*_*scu 5 task-parallel-library c#-4.0
我使用任务并行库来启动一些任务,如下所示:
public static void Main()
{
for (var i = 0; i < 10; i++)
{
var x = i;
Task.Factory.StartNew(() => new WorkerClass(x).Do());
}
// (*) Here I'd like to wait for all tasks to finish
Task.WaitAll();
Console.WriteLine("Ready.");
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
问题是某些任务本身可以创建新任务.这是WorkerClass看起来像:
public class WorkerClass
{
private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();
private readonly int _i;
public WorkerClass(int i)
{
_i = i;
}
public void Do()
{
if (_i % 3 == 0)
Task.Factory.StartNew(() => new WorkerClass(_i + 101).Do());
Log.Info("Started {0}", _i);
Thread.Sleep(2000);
Log.Info("Done {0}", _i);
}
}
Run Code Online (Sandbox Code Playgroud)
对于每个值为i3的倍数,将启动一个新任务.
我希望能够等到所有任务(包括其他任务创建的任务)完成.
是否有干净/内置的方法(有或没有TPL)?
Tys*_*son 15
保持对所有顶级任务的引用,然后使用WaitAll:
var tasks = new Task[10];
for (var i = 0; i < 10; i++)
{
var x = i;
tasks[i] = Task.Factory.StartNew(() => new WorkerClass(x).Do());
}
Task.WaitAll( tasks );
Run Code Online (Sandbox Code Playgroud)
对于子任务,只需确保将它们附加到父任务.这意味着在完成所有子任务之前,父任务不会进入完整状态.
Task.Factory.StartNew(() => { }, TaskCreationOptions.AttachedToParent);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4999 次 |
| 最近记录: |