C# 不正常地杀死基于线程的日志实例?
应用程序日志记录是通过自定义滚动平面文件日志记录库使用普通日志文件和钻孔日志文件完成的。为了降低对硬盘的写入访问量,当a)达到最大队列项目限制或b)经过一定时间后,日志事件将排队等待。对于时间间隔方面,日志库运行一个线程,定期刷新队列 现在,日志实例是静态可访问的、单例的和应用程序范围的(在许多其他库中使用),有时(尽管不应该),开发人员会忘记处理刷新线程,结果是,即使应用程序“关闭”,线程继续运行,应用程序必须通过任务管理器终止,这远远不够理想C# 不正常地杀死基于线程的日志实例?,c#,multithreading,logging,C#,Multithreading,Logging,应用程序日志记录是通过自定义滚动平面文件日志记录库使用普通日志文件和钻孔日志文件完成的。为了降低对硬盘的写入访问量,当a)达到最大队列项目限制或b)经过一定时间后,日志事件将排队等待。对于时间间隔方面,日志库运行一个线程,定期刷新队列 现在,日志实例是静态可访问的、单例的和应用程序范围的(在许多其他库中使用),有时(尽管不应该),开发人员会忘记处理刷新线程,结果是,即使应用程序“关闭”,线程继续运行,应用程序必须通过任务管理器终止,这远远不够理想 所以我想知道:是否有可能在应用程序退出时自动关闭
所以我想知道:是否有可能在应用程序退出时自动关闭线程?我知道关于
BackgroundWorker
、Timer
和Threadpool
,但这些解决方案对特定任务来说是好的吗?或者更好地坚持使用“经典”线程
?您可以使用System.Diagnostic.Process.GetCurrentProcess.Kill,但如果您使用的是dot net 4.0,我建议您使用tasks。这里是我推荐的一个很好的资源。检测应用程序即将退出,这与您正在运行的应用程序类型有关
我不太了解Aspx,但在WPF中,您可以使用以下代码连接System.Windows.Application类的退出事件,并在事件处理程序中优雅地关闭线程
此外,您应该始终避免终止线程,而不是优雅地关闭线程。如果可能,它可能会导致不一致,因为您无法控制线程何时真正退出。相反,您应该定期检查退出条件,如下面的代码所示
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;
}
}
尝试过nlog或log4net吗?@DanielMošmondor我熟悉nlog、log4net、企业应用程序日志块等。。虽然这些图书馆很整洁,但它们只不过是我们所需要的一种方式而已您使用的是WinForms还是WPF?@igelineau WPF和ASPX。但我看不出与日志记录有任何关系?这是一个很好的方法,可以当场解决我的问题。我甚至没有考虑应用程序。当前。退出事件。:)