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);
    }));
}

Task.WaitAll在所有任务完成之前返回

您的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.RunTask.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的呼叫将保持不变。