【问题标题】:How can I tell when all background threads in the current app have finished executing?如何判断当前应用程序中的所有后台线程何时完成执行?
【发布时间】:2011-07-15 01:16:20
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

  • 您的目标是什么版本的 .NET?
  • 如何创建后台线程?是new Thread() 吗?

标签: c# multithreading


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以添加对取消的支持:

    1. WorkerSupportsCancellation 属性设置为 true。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-11
        • 1970-01-01
        • 2014-07-19
        • 2012-01-07
        • 2015-03-25
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        相关资源
        最近更新 更多