【问题标题】:How can a .NET background thread detect that the main application is closing?.NET 后台线程如何检测到主应用程序正在关闭?
【发布时间】:2020-03-30 10:03:36
【问题描述】:

我正在编写一个库(一个 .NET Framework DLL)。

该库可用于各种应用程序:WinForm 应用程序、WPF 应用程序、ASP.NET 应用程序、Windows 服务……甚至是非托管应用程序(通过 COM 互操作)。

这个库创建了一个后台线程来执行一些维护任务。

挑战如下:当主应用程序关闭时,我的后台线程需要检测到这一点并进行一些清理以正常退出(关闭数据库连接等)。

我的后台线程如何检测(以与主机应用程序无关的方式)其进程即将终止,以便它可以开始其清理任务?


先前的研究:

【问题讨论】:

    标签: c# .net multithreading process


    【解决方案1】:

    您可以将处理程序附加到当前应用程序域的AppDomain.ProcessExit 事件。

    但是,你需要快速清理(引用the documentation,强调我的):

    在 .NET Framework 中,所有 ProcessExit 事件处理程序的总执行时间都是有限的,就像所有终结器的总执行时间在进程关闭时受到限制一样。 默认为两秒


    然而,宿主应用程序通常知道何时关闭,所以我的建议如下:

    • Shutdown 方法添加到您的库中,并记录实现者应该在关闭主机应用程序之前调用它。在那里打扫卫生。如果实施者按照建议执行,则此处没有时间限制。
    • AppDomain.ProcessExit 中,如果之前没有显式调用过Shutdown 方法,则调用它。您在这里确实有时间限制,但总比没有好。

    这类似于Dispose 模式的工作方式:当且仅当之前没有显式调用Dispose 时,才会在终结器中调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多