我有一个控制台应用程序,当我发出以下 2 行时,它有时不会退出:
File.AppendAllText(@"\bbdFLog", "Halting: " + DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + "n");
System.Environment.Exit(0);
停止消息已写入磁盘,但应用程序在任务管理器中仍处于活动状态。
应用程序确实使用线程计时器:
GetRecordsTimer = new System.Threading.Timer(new TimerCallback(GetRecordsCallBack), null, 60000, 0);
这被声明为:
public static System.Threading.Timer GetRecordsTimer;
但是我对 Environment.Exit(0( 的理解是杀死所有内容(所有线程(,然后退出。
注意:不仅应用程序仍然处于活动状态,而且我的日志文件 FLog 似乎正在使用中......
如果我之后立即退出,可能是 AppendAllText 不知何故没有完成吗?
根据您所描述的内容,我的想法是,对\bbd
的网络写入操作尚未完成。
如果您想记录并退出,但退出比日志记录更重要,也许可以尝试这样的事情:
ThreadPool.QueueUserWorkItem(state => {
Thread.Sleep(2000);
Environment.Exit(0);
});
File.AppendAllText(@"\bbdFLog", "Halting: " + DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + "n");
这样,无论如何,您的进程都将在 2 秒内退出;即使您的日志操作从未完成。
一个更优雅的解决方案可能会在日志操作完成后立即退出或在超时后退出,但我的代码只是一个示例