我正在开发一个Windows应用程序(不是WinForms,而不是Console,而不是WinService),只是一个带入门类的项目。 在.NET中,阻止应用程序退出Main方法的最佳方法是什么?
我知道我可以在Console.Read()的控制台中实现这一点,或者我可以使用EvenWaitHandle.WaitOne()并且永远不会调用Set()。
有更好的方法吗?
感谢您的帮助。
更新
这是该应用程序的概述。
我需要按需启动独立进程(某些exe),包含wcf服务。 WCF服务应该理智地监听,这就是我需要这个功能的原因。我能找到的最相似的方法是IIS(许多w3wp进程同时运行)。
w3svc.exe(IIS Windows服务)启动w3wp.exe的许多实例,具体取决于已收到的已配置应用程序池和请求的数量。
在我的应用程序中,我希望在IIS基础结构中保持代表w3wp.exe的进程,而不是w3svc。什么是在.NET中保持w3wp的消息循环?
答案 0 :(得分:6)
你可以用很多方式做到这一点。我个人喜欢这个,因为它非常易读且不言自明:
Process.GetCurrentProcess().WaitForExit();
答案 1 :(得分:1)
while(true)
{
// to make it less CPU intensive
Thread.Sleep(1000);
}
当然,您可以想到的任何解决方案都不会通过终止其流程来阻止强制终止应用程序。
答案 2 :(得分:1)
IIS是一个Windows服务,这就是它运行的原因。您可以查看其他选项,例如单个服务,您可以通过api调用它并告诉它启动另一个线程或监听器。启动应用程序的新实例不是最佳选择。通常,Windows应用程序都有一个messagepump,我认为这是一个while循环...这会阻止它退出。
但是,您也可以按照此处的示例进行操作,我认为这不会关闭无窗口窗口:
答案 3 :(得分:0)
System.Threading.Thread.Sleep(millisenconds);
答案 4 :(得分:0)
在您的更新中,您说该程序正在使用Process启动其他几个程序。 (它恰好是'你自己',但这并不重要。)
如果程序已经完成,那听起来就像它还有更多工作要做。该过程结束不会杀死它产生的所有进程。
你可以使用process.WaitForExit()
等待你产生的进程全部退出,而不是只是无所事事,如果由于某种原因你确实需要让进程保持活动状态。如果在产生其他过程后确实需要做某些事情,那么你需要告诉我们那是什么,因为如果有什么东西你应该等待某种事件,这是你没有的东西长大了。
编辑:您声称所有进程正在“监听”。定义该任务。如果你有一个阻止GetNextRequest方法,那么你只需要:while(true){GetNextRequest();}
。如果它是非阻塞的,那么使用BlockingCollection<MyRequests>
,其中接收方法/事件hanlder将新项添加到集合中,主线程有一个while循环,就像我在读取阻塞集合之前提到的那样。关键是你不应该只是坐在那里什么都不做;你正在做一些事情,所以在while(!done)
或while(true)
循环中这样做。如果方法没有阻塞,那么解决这个问题是一个相当明确的问题;只需将其包装在阻塞方法调用中。