Как подождать другого статуса процесса в .NET?

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

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

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

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

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

4 ответа

Вы можете передать имя Semaphore службе в командной строке (или через какой-либо другой механизм, например, жесткое кодирование), а затем ждать службы 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


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

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

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


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

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

Подсказка: вы хотите, чтобы событие auto- reset, которое "переворачивает" свое состояние назад, немедленно запускает все ожидающие потоки.

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


Вы можете использовать каналы 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

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

licensed under cc by-sa 3.0 with attribution.