我怎么知道当前应用程序中的所有后台线程是否已经完成执行
本文关键字:是否 线程 执行 后台 应用程序 我怎么知道 | 更新日期: 2023-09-27 18:01:58
我有一些代码,可以从它的任何地方产生后台工作线程。
我现在需要从一个winforms应用程序运行相同的代码(这通常会通过visual studio而不是从一个独立的exe运行)。
当我运行主线程时,它退出并将控制权返回给UI,但是可能仍然有后台线程在运行。然后有人可以关闭应用程序/停止调试,它会终止其他线程。
我怎么能防止这种情况(我意识到我不能阻止它被终止,我的意思是让用户意识到所以他们不终止它)通过让我的应用程序意识到所有的子线程,可能已经产生并等待他们退出?
是否有一种方法可以获得当前正在执行的后台线程的数量,并等待它为零?
我宁愿不添加代码到我产生新线程的地方,因为这不是他们关心的。
谢谢
虽然您必须对线程及其启动器进行更改,但我使用的一种简单方法(如果您正在创建自己的线程)是在启动每个线程时增加计数器,并在每个线程中使用一个回调方法来减少计数器。
您可以添加取消支持:
-
设置WorkerSupportsCancellation属性为true
-
从DoWork事件处理程序中定期检查CancellationPending属性。如果为真,则将事件参数的Cancel属性设置为真,然后返回。
- 调用CancelAsync请求取消(或当您退出应用程序时)
您可以尝试使用Process.GetCurrentProcess.Threads
。
但请注意,您将始终至少有一个线程运行-您的主线程。所以不要等到值为零,因为在程序运行时它永远不会为零。
另外,我不确定,这将工作,因为该属性返回应用程序的操作系统线程不一定映射到托管线程,IIRC。
所以,正确的方法是实现一个跟踪机制,让你跟踪你的线程。
顺便说一句:简单地将线程声明为前台线程将防止应用程序在线程完成之前关闭。但是,它不会阻止你的UI关闭。