阻止应用程序退出

本文关键字:退出 应用程序 | 更新日期: 2023-09-27 18:29:15

我正在开发一个Windows应用程序(不是WinForms,不是Console,不是WinService(,只是一个带有入门类的项目。在 .NET 中,阻止应用程序退出 Main 方法的最佳方法是什么?

我知道我可以在控制台中使用 Console.Read(( 实现这一点,或者我可以使用 EvenWaitHandle.WaitOne(( 并且永远不要调用 Set((。

有没有更好的方法

提前感谢您的帮助。

更新:

这是应用程序的概述。

我需要按需启动包含 wcf 服务的独立进程(一些 exe(。WCF 服务应该以意识形态的方式侦听,这就是我需要此功能的原因。我能找到的最相似的方法是IIS(许多w3wp进程同时运行(。

w3svc.exe(IIS Windows 服务(启动许多 w3wp 实例.exe具体取决于它收到的已配置应用程序池和请求的数量。

在我的应用程序中,我想在 IIS 基础结构中保持代表 w3wp.exe 的进程,而不是 w3svc。什么样的消息循环可以使 .NET 中的 w3wp 保持活动状态?

阻止应用程序退出

你可以用很多方式做到这一点。我个人喜欢这个,因为它非常易读且不言自明:

Process.GetCurrentProcess().WaitForExit();

IIS是一个Windows服务,这就是为什么它像这样运行。您可以查看其他选项,例如单个服务,您可以在其中通过 api 调用它并告诉它启动另一个线程或侦听器。启动应用程序的新实例不是最佳选择。通常 Windows 应用程序有一个消息泵,我认为这是一个 while 循环......这将阻止它退出。

但是,您也可以按照此处的示例进行操作,我相信它不会关闭无形窗口:

运行无形通知用户控件?

while(true)
{
    // to make it less CPU intensive
    Thread.Sleep(1000);
}

当然,您能想到的任何解决方案都不会通过终止其进程来阻止应用程序的强制终止。

在您的更新中,您说该程序正在使用 Process 启动其他几个程序。(它恰好是"你自己",但这并不重要。

如果程序已经这样做了,听起来它就没有更多的事情要做。 该进程结束不会杀死它生成的所有进程。

您可以使用process.WaitForExit()来等待您生成的进程全部退出,而不是仅仅旋转什么都不做,如果出于某种原因您确实需要保持进程的活动。 如果在生成其他进程后它实际上需要做一些事情,那么你需要告诉我们那是什么,因为如果有东西你应该等待某种事件,这是你没有提出来的事情。

编辑:你声称所有的过程都在"倾听"。 定义该任务。 如果你有一个阻止GetNextRequest方法,那么你只需要:while(true){GetNextRequest();}。 如果它是非阻塞的,那么使用一个BlockingCollection<MyRequests>其中接收方法/事件hanlder向集合添加一个新项目,并且主线程有一个while循环,就像我在从阻塞集合中读取之前提到的一样。 关键是你不应该只是坐在那里什么都不做;您的进程正在做某事,因此请在while(!done)while(true)循环中执行此操作。 如果该方法没有阻塞,则这是一个定义合理的问题;只需将其包装在阻塞方法调用中即可。

System.Threading.Thread.Sleep(millisenconds);