Task.WaitAll在所有任务完成之前返回
本文关键字:返回 任务 WaitAll Task | 更新日期: 2023-09-27 18:27:14
WaitAll
不工作。在任务完成之前,我已完成。
我有一些小组。每个组都包含项目,我希望每个项目都在单独的任务中处理。
static void Main(string[] args)
{
List<Task> TaskList = new List<Task>();
foreach (string group in groups)
{
Task task = new Task(() => { scan_group(group, timeout); });
task.Start();
TaskList.Add(task);
}
Task.WaitAll(TaskList.ToArray());
Console.WriteLine("- Done !" );
}
public static void scan_group (){
Task.Factory.StartNew(() => Parallel.ForEach<string>(items, x =>
{
scan(x, y);
}));
}
您的scan_group
所做的就是启动一个任务,而不等待它完成,也不等待它返回到外部等待。
所以你只需要等待内部任务的创建,而不是等待它们完成。这就是为什么在内部任务运行之前获得Done
的原因。
如果要等待scan_group
任务,请返回它们并将其存储在列表中,而不是使用任务构造函数创建任务。例如:
foreach (string group in groups)
{
TaskList.Add(Task.Factory.StartNew(() => Parallel.ForEach<string>(items, x => scan(x, y))));
}
Task.WaitAll(TaskList.ToArray());
注意:直接使用Task
构造函数几乎从来都不是正确的解决方案。此外,如果您在.Net 4.5及以上版本,Task.Run
比Task.Factory.StartNew
更可取。
发生这种情况是因为您没有等待任何任务。Task.WaitAll
会等待,直到scan_group()
的所有任务都完成。但是,您的scan_group()
方法应该是一个异步任务。
在这个方法中,您可以对在那里创建的任何任务使用await
。目前,您只是在scan_group()
方法中开始一个新任务,但并不等待这些任务。这会导致任务在另一个线程上的某个地方启动,但启动它的线程已经移动并结束了该方法。调用方法将此视为正在完成的任务。
一些实现:
scan_group()
:声明
public static async Task scan_group()
{
// create tasks for your tasks inside this method.
List<Task> itemTasks = new List<Task>();
items.foreach(x => itemTasks.Add(scan(x,y));
await Task.WhenAll(itemTasks.ToArray());
}
您对scan_group
的呼叫将保持不变。