如何确保C#控制台程序始终退出?

时间:2011-11-16 22:05:55

标签: c# application-shutdown

我已经编写了一个小型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();
}

我认为通过这种结构,我的应用程序无法成为僵尸进程。但是,当我试图推送这个应用程序的新版本时,我反复发现我无法删除和替换可执行文件,因为"文件正在使用",这意味着它挂在某人身上。计算机在那里,即使它应该只运行几秒钟并且总是关机。

那么,我的应用程序看起来如何成为人们的一个悬而未决的过程呢?我有代码结构的电脑?我错过了什么?

编辑:添加"应用程序。"解析ShutDown()是为了清晰。

2 个答案:

答案 0 :(得分:2)

这里有两个选项:

  1. 你的控制台应用程序在3秒内没有完成,但需要更长的时间。你需要对它进行调试,看看它需要多长时间。
  2. 您的控制台应用程序需要3秒才能退出,但GUI会每分钟运行一次,并且您有超过40个用户,因此查找未使用的可执行文件的可能性很小。
  3. 如果它是第一个,并且你不想调试它,你总是可以启动第二个线程,等待3秒然后终止整个过程。

答案 1 :(得分:1)

也许try块中的代码仍在为至少一个客户端执行,并且实际上并不限于3s左右。为了防止出现这种情况,您需要多线程应用程序 - 一个用于处理的线程,一个在后台使用,在超时后终止工作线程。在此之前,您应该问自己是否真的需要这样的基础设施。

另一件令人想到的事情是,其中一个用户此时正在运行该应用程序,概率取决于您的用户数量。

也许将支持应用程序设计为始终运行的多线程服务将是一个更好的主意,而不是为每个客户端请求实例化一个正在运行的应用程序。