Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Или, может быть, с двух сторон: /IP/TwoWayRemoting.aspx

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top