为什么我尝试退出时C#控制台应用程序挂起?

时间:2019-06-12 14:47:39

标签: c# exit

我有一个控制台应用程序,当我发出以下两行代码时,有时不会退出:

        File.AppendAllText(@"\\bbd\FLog", "Halting: " + DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + "\n");
        System.Environment.Exit(0);

已将暂停消息写入磁盘,但该应用程序仍在taskmanager中运行。

该应用程序确实使用了线程计时器:

GetRecordsTimer = new System.Threading.Timer(new TimerCallback(GetRecordsCallBack), null, 60000, 0);

声明为:

public static System.Threading.Timer GetRecordsTimer;

我对Environment.Exit(0)的理解是杀死所有(所有线程)然后退出。

注意:不仅该应用程序仍在运行,而且我的日志文件FLog似乎正在使用中...

如果我之后立即退出,是否可能是AppendAllText未完成?

1 个答案:

答案 0 :(得分:0)

根据您的描述,我认为对\\bbd的网络写入操作尚未完成。

如果您要登录并退出,但是退出比登录更重要,请尝试执行以下操作:

ThreadPool.QueueUserWorkItem(state => {
    Thread.Sleep(2000);
    Environment.Exit(0);
});
File.AppendAllText(@"\\bbd\FLog", "Halting: " + DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + "\n");

这样,无论什么情况,您的过程都会在2秒内退出;即使您的日志操作从未完成。

日志操作完成或超时后,可能会退出一个更优雅的解决方案,但我的代码仅作为示例