Как ждать статус другого процесса в .NET? - PullRequest
3 голосов
/ 03 октября 2008

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

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

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

Позвольте мне повторить, что служба, когда она выполнит свою задачу, останется в состоянии «работа / в памяти», поэтому ожидание ее выхода не будет работать. ; -)

Кроме того, это исключительно для целей интеграционного тестирования и никогда не будет запущено в производство, поэтому слово "просто" - это оперативное слово.

Ответы [ 4 ]

5 голосов
/ 03 октября 2008

Вы можете передать Semaphore имя службе в командной строке (или с помощью другого механизма, такого как hard coding ), а затем подождать в службе до Release() его, вызвав WaitOne() в вашем exe.

Код приложения:

Semaphore s = new Semaphore(1, 1, "MyNamedSemaphore");
// start service, passing the string "MyNamedSemaphore"
s.WaitOne(); // will wait for Release() in service

Сервисный код:

// perform the initial task
// find semaphore name (i.e. from Environment.CommandLine)
Semaphore s = new Semaphore(1, 1, semaphoreName); // will use existing kernel object
s.Release(); // WaitOne in exe will complete
1 голос
/ 03 октября 2008

Можете ли вы изменить код услуги?

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

Подсказка: вам нужно событие автоматического сброса, которое немедленно «переворачивает» свое состояние и сразу же запускает все ожидающие потоки.

Я не уверен в подпрограммах .NET, но вам нужны Win32 CreateEvent, SetEvent и WaitForSingleObject.

1 голос
/ 03 октября 2008

WMI звонки должны дать вам то, что вам нужно. Вы можете отследить начатые / завершенные события и делать то, что вам нужно оттуда. (Спасибо Крису Лайвли за то, что показал мне это)

http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx

В качестве альтернативы вы можете использовать пространство имен System.Diagnostics.Processes для запроса одного конкретного активного процесса и выполнять цикл до тех пор, пока процесс не будет остановлен.

0 голосов
/ 03 октября 2008

Вы можете использовать каналы IPC: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-6143016.html

Или, может быть, двухстороннее удаленное взаимодействие: http://www.codeproject.com/KB/IP/TwoWayRemoting.aspx

Маршрут базы данных будет простым , но не обязательно лучшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...