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

时间:2015-12-17 12:56:43

标签: c# .net task-parallel-library

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

2 个答案:

答案 0 :(得分:4)

var archive = archiver.create('zip', {}); archive.on('error', function(err){ throw err; }); archive.directory('/dirToZip','').finalize(); 所做的就是开始一项任务,而不是等待它完成,或者让它等待在外面等。

因此,您只需等待创建内部任务,您就不必等待它们完成。这就是为什么在内部任务运行之前得到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()); 构造函数几乎不是正确的解决方案。如果您使用.Net 4.5及更高版本,Task也优于Task.Run

答案 1 :(得分:0)

这种情况正在发生,因为您没有等待任何任务。 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的通话将保持不变。