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);
}));
}
答案 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
的通话将保持不变。