2

我编写了一个小型 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() 。

4

2 回答 2

2

这里有两个选项:

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

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

于 2011-11-16T22:12:34.117 回答
1

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

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

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

于 2011-11-16T22:19:55.250 回答