【问题标题】:Creating Tasks dynamically and wait for completion (C#)动态创建任务并等待完成(C#)
【发布时间】:2018-08-22 03:06:52
【问题描述】:

在我的 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 时没有等待,最后它也没有等待。 有谁知道如何解决它?

【问题讨论】:

标签: c# .net task


【解决方案1】:

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.ToArray());
       tasksToWait.Clear();
       i = 1;
   } 
} 

这是您上面代码中的一个代码片段


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

【讨论】:

  • 谢谢伊戈尔!我知道我的代码可能是废话,但对我来说没问题。你的代码对我帮助很大。谢谢!
  • Task.WaitAll 只是数组列表除外。因此,您应该像 Task.WaitAll(tasksToWait.ToArray()) 这样调用
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多