我怎么知道当前应用程序中的所有后台线程是否已经完成执行

本文关键字:是否 线程 执行 后台 应用程序 我怎么知道 | 更新日期: 2023-09-27 18:01:58

我有一些代码,可以从它的任何地方产生后台工作线程。

我现在需要从一个winforms应用程序运行相同的代码(这通常会通过visual studio而不是从一个独立的exe运行)。

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

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

是否有一种方法可以获得当前正在执行的后台线程的数量,并等待它为零?

我宁愿不添加代码到我产生新线程的地方,因为这不是他们关心的。

谢谢

我怎么知道当前应用程序中的所有后台线程是否已经完成执行

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

您可以添加取消支持:

  1. 设置WorkerSupportsCancellation属性为true

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

  3. 调用CancelAsync请求取消(或当您退出应用程序时)

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

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

所以,正确的方法是实现一个跟踪机制,让你跟踪你的线程。

顺便说一句:简单地将线程声明为前台线程将防止应用程序在线程完成之前关闭。但是,它不会阻止你的UI关闭。