如何在不阻止GUI的情况下等待多个任务?

时间:2015-03-03 18:45:34

标签: c# .net multithreading winforms

在C#.NET 4.0 Windows窗体GUI应用程序中,为了响应单击按钮,我需要生成大量进程并在列表框中显示它们。当每个进程结束时,它应该从列表中删除,并且当所有进程完成时,应该发生一些事情。

因为它是4.0,我认为使用Task是最好的路线,但我不能只运行一堆任务并调用Task.WaitAll,因为这会阻止主UI线程,因为按钮单击处理程序不会返回。

实现这个的最好方法是什么?我可以看到两个主要选项:

  1. 按钮处理程序启动一个任务,该任务运行所有其他任务并等待它们完成。
  2. 我不使用Task.WaitAll - 因为每个任务完成它检查(或告诉应用程序检查)是否所有任务都已完成。
  3. 但是这里有使用TPL的标准/首选解决方案吗?

    另外 - Task可以更新我的表格GUI,还是我需要解耦任务-GUI交互,例如当Task完成后,它会在Form

    上触发一个事件

    伪代码会很棒 - 我是TPL的新手,也是.NET 4.0中很多有趣的东西。

1 个答案:

答案 0 :(得分:1)

如果您使用的是.NET 4.5,则会使用await Task.WhenAll(...)之类的内容。它可以处理IEnumerable<Task>Task[]以及IEnumerable<Task<TResult>>

如果你无法使用.NET 4.5,你可以提出一个自己的解决方案,它将涉及Task.ContinueWith以及一个计算器,它将使用{{1 }}。此外,您可以通过查看此源来了解它在.NET 4.5中的完成情况。 http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,69351c6da968e5d1。它有点冗长,但它基本上就是我所说的:任务继续执行更新内部计数器的其他任务。