Остановить приложение от выхода - PullRequest
2 голосов
/ 28 марта 2012

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

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

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

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

ОБНОВЛЕНИЕ:

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 28 марта 2012

Вы можете сделать это по-разному.Мне лично нравится этот, так как он очень читабелен и не требует пояснений:

Process.GetCurrentProcess().WaitForExit();
1 голос
/ 28 марта 2012

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

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

Запустить контроль формы без уведомления пользователя?

1 голос
/ 28 марта 2012
while(true)
{
    // to make it less CPU intensive
    Thread.Sleep(1000);
}

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

0 голосов
/ 28 марта 2012

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

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

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

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

0 голосов
/ 28 марта 2012
System.Threading.Thread.Sleep(millisenconds);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...