繁体   English   中英

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

[英]How to wait for multiple Tasks without blocking the GUI?

在C#.NET 4.0 Windows Forms GUI应用程序中,响应单击一个按钮,我需要产生大量进程并将它们显示在列表框中。 当每个进程结束时,应将其从列表中删除,完成所有进程后,应该会发生某些情况。

从4.0开始,我认为使用Task是最好的方法,但是我不能只运行一堆任务并调用Task.WaitAll因为那样会阻塞主UI线程,因为按钮单击处理程序不会返回。

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

  1. 按钮处理程序将启动一个任务,该任务将运行所有其他任务,并等待它们完成。
  2. 我不使用Task.WaitAll每个任务完成时,它都会检查(或告诉应用程序进行检查)所有任务是否都已完成。

但是这里有使用TPL的标准/首选解决方案吗?

此外-可以在Task更新我的形式GUI或者我需要去耦任务的GUI交互,例如当Task完成它激发了一个事件Form

伪代码很棒-我是TPL的新手,并且.NET 4.0中提供了许多有趣的东西。

如果使用的是.NET 4.5,则应使用await Task.WhenAll(...) 它可以处理IEnumerable<Task>Task[]以及IEnumerable<Task<TResult>>

如果没有方法可以使用.NET 4.5,则可以自己提出一个解决方案,其中涉及Task.ContinueWith和一个剩余要运行的任务的计数器,该计数器使用Interlocked.Decrement更新。 另外,您可以通过查看此源来查看在.NET 4.5中的完成方式。 http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs,69351c6da968e5d1 这有点冗长,但基本上就是我所说的:任务与其他一些更新内部计数器的任务一起继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM