不正常地终止基于线程的日志记录实例

本文关键字:日志 记录 实例 线程 终止 于线程 不正常 | 更新日期: 2023-09-27 18:32:33

应用程序日志记录是通过自定义滚动平面文件日志记录库使用普通且无聊的日志文件完成的。为了减少对硬盘的写入访问量,当 a( 达到最大队列项限制或 b( 经过一定时间时,日志记录事件将排队等待。对于时间间隔方面,日志记录库运行一个线程,该线程定期刷新队列。

现在,日志记录实例是静态可访问的、单例和应用程序范围的(在许多其他库中使用(,有时(尽管不应该(开发人员忘记释放刷新线程,结果是,即使应用程序"关闭",线程也会继续运行,并且必须通过任务管理器杀死应用程序, 这远非理想。

所以我想知道:是否有可能在应用程序退出时自动关闭线程?我知道BackgroundWorkerTimerThreadpool,但是这些是针对该特定任务的好解决方案吗?或者最好坚持使用"经典"Thread

不正常地终止基于线程的日志记录实例

检测应用程序即将退出非常特定于您正在运行的应用程序类型。

我对 Aspx 了解不多,但在 WPF 中,您可以使用以下代码挂接 System.Windows.Application 类的 Exit 事件,并在事件处理程序中优雅地关闭线程。

此外,您应该始终避免杀死线程而不是优雅地关闭,如果可能,它可能会导致不一致,因为您无法控制它何时真正退出。 相反,您应该定期检查退出条件,如下面的代码所示。

public static class MyLogger
{
    public static void Initialize()
    {
        if(IsWPFApplication())
            Application.Current.Exit += Application_Exit;
        //start flush thread and other initializations...
    }
    private static bool IsWPFApplication()
    {
        Dispatcher dispatcher = Dispatcher.FromThread(Thread.CurrentThread);
        return (dispatcher != null);
    }
    private static void Application_Exit(Object sender, EventArgs e)
    {
        Shutdown();
    }
    private static void Shutdown()
    {
        ExitRequested = true;
    }
}

您可以使用System.Diagnostic.Process.GetCurrentProcess.Kill,但如果您使用的是dot net 4.0,我建议您使用任务。 这是我推荐 http://www.albahari.com/threading/的绝佳资源。