0

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

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

所以我想知道:是否有可能在应用程序退出时自动关闭线程?我知道 BackgroundWorker,TimerThreadpool, 但是对于特定任务来说,这些是好的解决方案吗?还是更好地坚持“经典” Thread

4

2 回答 2

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;
    }
}
于 2013-09-23T23:54:38.983 回答
0

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

于 2013-09-23T23:32:55.847 回答