Как мне ждать, пока консольное приложение не будет работать? - PullRequest
8 голосов
/ 29 апреля 2010

У меня есть консольное приложение, которое запускается, размещает кучу сервисов (длительный запуск), а затем ждет, когда клиенты вызовут его. У меня есть интеграционные тесты, которые запускают это консольное приложение и делают "клиентские" вызовы. Как подождать, пока консольное приложение завершит свой запуск, прежде чем звонить клиенту?

Я хочу избежать Thread.Sleep(int), потому что это зависит от времени запуска (которое может измениться), и я теряю время, если запуск быстрее .

Process.WaitForInputIdle работает только в приложениях с пользовательским интерфейсом (и я подтвердил, что в этом случае возникает исключение).

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

Ответы [ 5 ]

10 голосов
/ 29 апреля 2010

Одним из вариантов будет создание именованного EventWaitHandle. Это создает объект синхронизации, который вы можете использовать в разных процессах. Затем ваши клиентские приложения ждут, пока событие не будет сообщено, прежде чем продолжить. Как только приложение главной консоли завершило запуск, оно может сигнализировать о событии.

http://msdn.microsoft.com/en-us/library/41acw8ct(VS.80).aspx

Например, ваше консольное приложение «Сервер» может иметь следующее. Это не скомпилировано, поэтому это просто отправная точка:)

using System.Threading;
static EventWaitHandle _startedEvent;
static void main()
{  
  _startedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\ConServerStarted");

  DoLongRunnningInitialization();

  // Signal the event so that all the waiting clients can proceed
  _startedEvent.Set();
}

Клиенты тогда будут делать что-то вроде этого

using System.Threading;
static void main()
{  
  EventWaitHandle startedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\ConServerStarted");

  // Wait for the event to be signaled, if it is already signalled then this will fall throught immediately.
  startedEvent.WaitOne();    

//  ... continue communicating with the server console app now ...
}
4 голосов
/ 29 апреля 2010

Как насчет установки мьютекса и его удаления после запуска? Пусть клиентское приложение подождет, пока оно не сможет захватить мьютекс, прежде чем оно начнет что-либо делать.

1 голос
/ 29 апреля 2010

Создайте службу WCF, которую вы можете использовать для запроса статуса серверного процесса. Запускайте эту службу, только если в командной строке передана определенная команда. Следующие черты обеспечат очень быстрый запуск этой службы:

  • Размещение этой службы в качестве первой операции клиентского приложения
  • Используйте привязку net.tcp или net.pipe, потому что они начинаются очень быстро
  • Сохраняйте эту службу как можно более простой, чтобы гарантировать, что до тех пор, пока консольное приложение не прекратит работу, оно останется доступным

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

1 голос
/ 29 апреля 2010

Включите проверку готовности в клиентском интерфейсе приложения или сделайте так, чтобы оно возвращало ошибку не готовности, если вызвано до его готовности.

0 голосов
/ 29 апреля 2010
  • Поскольку оба (консольное приложение и приложение для тестирования интеграции, которое выполняет клиентские вызовы - как я понимаю) - это отдельное приложение, поэтому должен существовать механизм - мост - который будет указывать play как посредника (сокет , внешний файл, реестр и т. д.).

  • Другая возможность может состоять в том, что вы придумали среднее время, которое требуется консоли для загрузки служб и использования этого времени в тестовом приложении; ну, просто мысли вслух!

...