【问题标题】:Why is my c# console application hanging when I try to exit?为什么我尝试退出时我的 c# 控制台应用程序挂起?
【发布时间】:2019-06-12 14:47:39
【问题描述】:

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

        File.AppendAllText(@"\\bbd\FLog", "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 没有完成?

【问题讨论】:

  • Environment.Exit 不会终止线程,它只会终止您的应用程序。
  • 请创建一个minimal reproducible example
  • @TonyAbrams 如果某些线程正在运行,应用程序不会终止,是吗?
  • @TonyAbrams 终止一个进程会导致该进程中的每个线程终止。如果这些线程不能被终止,那么进程也不能被终止。
  • 它是 Windows 中的 known problem,它返回了几次。但在控制台模式应用程序中不太可能,下一个可能的原因是具有“深度扫描”功能的糟糕反恶意软件。

标签: c# exit


【解决方案1】:

根据您的描述,我的想法是对\\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 秒内退出;即使您的日志操作从未完成。

更优雅的解决方案可能会在日志操作完成或超时后立即退出,但我的代码仅用于示例

【讨论】:

  • 我喜欢这样。我知道如果不在主线程上使用 System.Diagnostics.Process.GetCurrentProcess().Kill() 而不是 Environment.Exit() 可能会更好?你同意吗?
  • Environment.Exit() 文档指出:“退出会立即终止应用程序,即使其他线程正在运行。” Process.Kill 可能会做同样的事情,但它旨在杀死 a 进程,而 Environment.Exit() 旨在杀死 当前进程。我更喜欢Environment.Exit(),减少活动部件。
  • 明白。我在 AppendAllText 之后立即退出的事实会以某种方式导致文件不被释放吗?
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多