如何判断当前应用程序中的所有后台线程何时完成执行?

时间:2011-07-14 08:51:30

标签: c# multithreading

我有一些代码可以从其中的任何位置生成后台工作线程。这通常作为Windows服务运行。

我现在需要从win表单应用程序运行相同的代码(通常通过visual studio运行,而不是从独立的exe运行)。

当我运行主线程时,它退出并将控制权返回给UI,但是仍然可能有后台线程在运行。然后有人可以关闭app / stop调试并终止其他线程。

我如何防止这种情况(我意识到我无法阻止它被终止,我的意思是让用户知道所以他们不要终止它)让我的应用程序知道所有可能的子线程已经产生并等待它们退出?

有没有办法获取当前正在执行的后台线程的数量并等待它为零?

我宁愿不将代码添加到我生成新线程的地方,因为它不是他们关心的问题。

由于

3 个答案:

答案 0 :(得分:1)

您可以添加取消支持:

  1. WorkerSupportsCancellation 属性设置为true。

  2. 定期检查 DoWork事件处理程序中的 CancellationPending 属性。如果是,则将事件参数的Cancel属性设置为true,然后返回。

  3. 致电取消订阅同步以请求取消。 (或退出申请时)

答案 1 :(得分:1)

虽然您必须对线程及其启动器进行更改,但我使用的一种简单方法(如果您正在创建自己的线程)是在启动每个线程并使用回调时递增计数器每个线程中减少计数器的方法。

答案 2 :(得分:0)

您可以尝试使用Process.GetCurrentProcess.Threads 但请注意,您将始终至少运行一个线程 - 您的主线程。所以不要等到值达到零,因为它在程序运行时永远不会。

此外,我不确定,这是可行的,因为该属性返回应用程序的操作系统线程,这些线程不一定映射到托管线程IIRC。

因此,正确的方法是实现跟踪机制,让您跟踪线程。

BTW:简单地将线程声明为前台线程将阻止应用程序关闭,直到线程完成。但是,它不会阻止您的UI关闭。