2011-11-16 85 views
2

我写了一个小型C#控制台应用程序,供许多用户在共享存储服务器上使用。它的运行时间应该总是在3秒钟左右<,并在后台自动运行,以帮助用户真正尝试使用的另一个GUI应用程序。因此,我想确保程序总是完全退出,不管它是否引发错误或不是。如何确保C#控制台程序总是退出?

在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()。

+3

不要从共享驱动器运行应用程序。在主应用程序中包含一些升级逻辑,以将控制台应用程序复制到本地计算机,或将逻辑移动到主应用程序中,以便在单独的线程上运行。 –

+0

'ShutDown()'究竟发生了什么? –

+0

@KyleTrauberman,我认为你是对的,我将把它放在后面,但我仍然想知道确保C#应用程序始终关闭的最佳实践/最佳方法,无论出现什么错误或什么情况。 – JoeCool

回答

2

有两个选项:

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

如果它是第一个,并且你不想调试它,你总是可以启动第二个线程,等待3秒钟,然后杀死整个过程。

1

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

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

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

相关问题