不合理地杀死基于线程的日志记录实例?

时间:2013-09-23 22:16:11

标签: c# multithreading logging

应用程序日志记录是通过自定义滚动平面文件日志记录库使用普通和无聊的日志文件完成的。要降低对硬盘的写访问量,记录事件会在a)达到最大队列项限制或b)经过一定时间后排队等待。对于时间间隔方面,日志记录库运行一个定期刷新队列的线程。

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

所以我想知道:是否有可能在应用程序退出时自动关闭线程?我知道BackgroundWorkerTimerThreadpool,但是那些特定任务的解决方案是什么?或者更好地坚持使用'经典'Thread

2 个答案:

答案 0 :(得分:1)

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

我对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;
    }
}

答案 1 :(得分:0)

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