2012-03-27 7 views
2

Я работаю над приложением Windows (а не с WinForms, а не с консолью, а не с WinService), это просто проект с классом записи. Как лучше всего, в .NET, остановить приложение от выхода из метода Main?Остановить приложение от выхода

Я знаю, что могу добиться этого в консоли с помощью Console.Read(), или я могу использовать EvenWaitHandle.WaitOne() и никогда не вызывать Set().

Есть ли лучший способ сделать это?

Спасибо за помощь заранее.

UPDATE:

Это обзор приложения.

Мне нужно запустить независимые процессы (некоторые exe) по запросу, содержащие wcf-службу. Служба WCF должна слушаться идеально, и поэтому мне нужна эта функциональность. Самый похожий подход, который я могу найти, - это IIS (многие процессы w3wp работают одновременно).

w3svc.exe (служба Windows IIS) запускает множество экземпляров w3wp.exe в зависимости от количества настроенных пулов приложений и запросов, которые он получает.

В моем приложении я хочу поддерживать процессы, представляющие w3wp.exe, в инфраструктуре IIS, а не в w3svc. Каков тип цикла сообщений, который будет поддерживать w3wp в .NET?

+1

И что приложение на самом деле делать? У вас есть другой поток, открывающий работу? Если это так, просто не помещайте его в другой поток, чтобы основной метод не заканчивался до тех пор, пока работа не будет выполнена (даже если работа никогда не заканчивается). – Servy

+1

Пока (правда); для (; ;) ; –

+0

@AnuragRanjhan слишком много ';' в цикле for, и эти параметры хуже, чем просто 'WaitOne' или' Thread.Sleep' – Servy

ответ

1

IIS - это сервис для Windows, поэтому он работает следующим образом. Вы можете посмотреть другие параметры, такие как один сервис, где вы можете вызвать его через api и сообщить ему, чтобы начать другой поток или прослушиватель. Запуск новых экземпляров приложений не самый лучший вариант. Как правило, в приложениях Windows есть messagepump, который, как я думаю, представляет собой цикл while ..., который помешает ему выйти из него.

Однако, вы можете также следовать примеру здесь, который я считаю, не закрывает окно бесформенный:

Run Formless Notification User Control?

+0

Я знаю, что IIS - это служба Windows, но не все экземпляры w3wp.exe, которые вы видите в диспетчере задач. Они начинаются с w3svc.exe (IIS). Я хочу добиться того же. какой насос сообщений работает внутри w3wp? Это реальный вопрос. –

+1

просто используйте стандартный насос сообщений с окнами ... это всего лишь эффективный цикл while. Я верю, что если вы пойдете по ссылке, которую я разместил, у вас будет то, что вам нужно, потому что я думаю, что окна просто запускаются прямо сверху и скрывают насос от вас. – Timmerz

+0

Ваша ссылка имеет смысл. позвольте мне попробовать. благодаря –

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

Конечно, любое решение, о котором вы можете подумать, не будет препятствовать принудительному прекращению применения, убив его процесс.

6

Вы можете сделать это в много разных способов. Я лично, как этот, так как это очень читаемый и Спроецировать

Process.GetCurrentProcess().WaitForExit(); 
+0

Еще одна подобная идея: 'Thread.CurrentThread.Join();' –

0

В вашем обновлении вы говорите, что программа начинает несколько других программ с использованием процесса. (Это бывает «самостоятельно», но это не имеет значения.)

Если программа уже выполнена, похоже, что ей больше нечего делать. Окончание этого процесса не приведет к уничтожению всех процессов, которые он породил.

Вы можете использовать process.WaitForExit(), чтобы дождаться процессов, которые вы порождаете для выхода, а не просто вращающихся, ничего не делая, если по какой-то причине вам действительно нужно сохранить процесс в живых. Если есть что-то, что ему действительно нужно делать после нереста других процессов, тогда вам нужно будет рассказать нам, что это такое, потому что если есть что-то, что вы должны ждать на каком-то событии, то это то, воспитывался.

Редактировать: вы утверждаете, что весь процесс выполняет «прослушивание». Определите эту задачу. Если у вас есть блокирующий метод GetNextRequest, вы просто имеете: while(true){GetNextRequest();}. Если он не блокируется, используйте использование BlockingCollection<MyRequests>, в котором метод получения/событие hanlder добавляет новый элемент в коллекцию, а основной поток имеет цикл while, как я уже упоминал, прежде чем читать из блокирующей коллекции. Дело в том, что вы никогда не должны просто сидеть и ничего не делать; вы делаете что-то, поэтому делайте это в цикле while(!done) или while(true). Если метод не блокирует, это достаточно хорошо определенная проблема для решения; просто оберните его вызовом метода блокировки.

+0

Опять же, эти процессы содержат службы wcf. Они слушатели, им нужно быть неопределенно. Я не хочу, чтобы они выходили, я хочу, чтобы они продолжали слушать. Что ждет WaitForExit? кусок работы? или есть сигнал, чтобы закрыть его? –

+0

Вы говорите, что ваша программа порождает другие процессы, предположительно используя класс 'Process'. Вы можете ждать этих процессов, если вам нужно подождать. Если вы говорите о рабочих процессах, а не о процессе их возникновения, то нет ли блокирующих вызовов для методов прослушивания? – Servy

+0

Я понимаю, что я не понимаю. Я хочу знать, как никогда не выйти из основного метода каждого из этих процессов (exe). Я не беспокоюсь о том, что программа запускает мои процессы, потому что это служба Windows, и я знаю, что она будет работать вечно, если я не остановлю службу Windows. Я беспокоюсь, что те, которые не являются службами Windows, которые запускаются моей службой Windows, и что я хочу, чтобы они были навсегда, если я не убью их. –

Смежные вопросы