문제

.NET의 통합 테스트 프로젝트를 진행하고 있습니다. 테스트 프레임 워크 실행 파일은 서비스를 시작한 다음 서비스가 작업을 완료 할 때까지 기다려야합니다.

EXE가 작업을 완료하기 위해 서비스를 기다리는 가장 좋은 방법은 무엇입니까 (서비스 자체가 작업 완료시 출구되지 않음)?

두 프로세스 모두 동일한 데이터베이스에 액세스 할 수 있으므로 첫 번째 생각은 서비스 상태를 기록하는 간단한 테이블이었습니다. 일단 그것이 완료되었음을 알리면, EXE는 대기를 중단하고 작업을 완료 할 수 있습니다. 다른 접근법?

서비스가 작업을 완료 한 후에는 실행/인 메모리 상태로 유지되므로 종료를 기다리는 것은 작동하지 않습니다. ;-)

또한 이것은 순전히 통합 테스트 목적을위한 것이며 결코 생산에 들어 가지 않을 것이므로 "간단한"은 작동 단어입니다.

도움이 되었습니까?

해결책

당신은 통과 할 수 있습니다 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 통화는 필요한 것을 제공해야합니다. 시작/완성 된 이벤트를 잡아서 거기에서 필요한 일을 할 수 있습니다. (Chris Lively에게 이것을 보여 주셔서 감사합니다)

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

또는 System.Diagnostics.Processes 네임 스페이스를 사용하여 하나의 특정 활성 프로세스에 대한 쿼리를 사용하고 프로세스가 죽을 때까지 루프를 사용할 수 있습니다.

서비스 코드를 수정할 수 있습니까?

그렇다면 커널 이벤트 객체를 사용하십시오. 서비스는 하나를 생성 할 수 있고, 앱이 신호를 대기 할 때까지 대기 할 수 있으며, 서비스가 완료되면 신호를 보낼 수 있습니다. 당신은 이벤트에 크로스 프로세스를 사용하기 위해 이름을 부여해야하지만, 그것은 얻는 것만 큼 간단합니다. 서비스는 이벤트 코드가있는 상태에서 계속 실행될 수 있습니다. 같은 이름의 이벤트를 만들려고하지 않는 한 아무도 알 수 없습니다. (또는 TestApp이 이벤트를 생성 할 수 있고 서비스는 이벤트를 열 수 있습니다. 서비스는 처음 시작한 곳에 따라 서비스를 열 수 있습니다. 성공하면 트리거링을 수행 할 수 있습니다. 그렇지 않으면 평소와 같이 작동합니다).

힌트 : 당신은 상태를 뒤로 젖히는 자동리스 세트 이벤트를 원합니다.

.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

데이터베이스 경로는 다음과 같습니다 단순한, 그러나 반드시 최고는 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top