如何确保c#控制台程序总是退出?

本文关键字:程序 退出 控制台 何确保 确保 | 更新日期: 2023-09-27 18:15:08

我写了一个小的c#控制台应用程序,供许多用户在共享存储服务器上使用。它的运行时应该总是<3秒左右,并在后台自动运行,以辅助用户真正想要使用的另一个GUI应用程序。正因为如此,我想确保程序总是完全退出,不管它是否抛出错误或其他什么。

在Application_Startup中,我有基本的结构:

try
{
    // Calls real code here
}
catch
{
    // Log any errors (and the logging itself has a try with empty catch around it
    // so that there's no way it can causes problems)
}
finally
{
    Application.Shutdown();
}

我认为有了这种结构,我的应用程序不可能成为僵尸进程。然而,当尝试推出这个应用程序的新版本时,我反复发现我无法删除和替换可执行文件,因为"文件正在使用中",这意味着它挂在别人的电脑上,即使它应该只运行几秒钟并且总是关闭。

那么,为什么我的应用程序似乎成为一个挂在人们的计算机与我的代码结构?我错过了什么?

编辑:为了清晰,添加了"Application."来解析ShutDown()

如何确保c#控制台程序总是退出?

这里有两个选项:

    你的控制台应用程序并不是真的在3秒内完成,而是需要更长的时间。你需要调试它,看看是什么花了这么长时间。
  1. 您的控制台应用程序需要3秒退出,但它每分钟由GUI运行一次,并且您有超过40个用户,因此发现未使用的可执行文件的可能性很小。

如果它是第一个线程,并且你不想调试它,你可以总是启动第二个线程,等待3秒,然后终止整个进程

可能try块内的代码仍然至少为一个客户端执行,并且实际上不限于3秒左右。为了防止这种情况,您需要多线程应用程序—一个线程用于处理,另一个线程在超时后在后台杀死工作线程。在此之前,你应该问问自己是否真的需要这样的基础设施。

另一件想到的事情是,一个用户正在运行应用程序,概率取决于用户的数量。

也许把你的支持应用设计成一个始终运行的多线程服务会比为每个客户端请求实例化一个运行的应用要好得多。