动态创建任务并等待完成(C#)

时间:2018-03-13 18:23:43

标签: c# .net task

在我的C#项目中,我必须打开一堆图像。

让我们说我们需要打开50.我的计划是创建10个任务,做一些事情,然后在创建下一个10个任务之前等待每个任务完成。

var fd = new OpenFileDialog
{
    Multiselect = true,
    Title = "Open Image",
    Filter = "Image|*.jpg"
};

using (fd)
{
    if (fd.ShowDialog() == DialogResult.OK)
    {
       int i = 1;                
       foreach (String file in fd.FileNames)
       { 
           if (i <= 10) {
               i++;
               Console.WriteLine(i + ";" + file);
               Task task = new Task(() =>
               {
                   // do some stuff
               });
               task.Start();
           } 
           else
           {
               Task.WaitAll();
               i = 1;
           } 
       }  
    }
}
Console.WriteLine("Wait for Tasks");
Task.WaitAll();
Console.WriteLine("Waited);

当i = 10时,代码不等待,最后它也没有等待。 有人知道如何解决它?

谢谢!

1 个答案:

答案 0 :(得分:2)

Task.WaitAll期望Task数组等待,您永远不会传入任何内容。以下更改将等待您启动的所有任务。

List<Task> tasksToWait = new List<Task>();
foreach (String file in fd.FileNames)
{ 
   if (i <= 10) {
       i++;
       Console.WriteLine(i + ";" + file);
       Task task = new Task(() =>
       {
           // do some stuff
       });
       task.Start();
       tasksToWait.Add(task);
   } 
   else
   {
       Task.WaitAll(tasksToWait);
       tasksToWait.Clear();
       i = 1;
   } 
} 

这是上面代码中包含更改的代码片段

注意此答案不包含对您的设计选择及其可能存在的缺陷的批评。