2009-06-10 2 views
0

두 응용 프로그램, WinForms 응용 프로그램과 Windows 서비스가 둘 다 동일한 시스템에서 실행됩니다. WinForms 앱이 서비스가 실행 중일 때이를 안정적으로 감지하기를 원합니다. 나는 두 응용 프로그램의 설계 및 구현을 완전히 제어 할 수 있습니다.내 응용 프로그램 중 다른 응용 프로그램이 실행 중임을 안전하게 확인합니다.

내 첫 번째 생각은 Mutex을 사용하고 서비스에서 인스턴스화하고 WinForms App에서 감지 할 수 있습니다.

더 좋은 디자인이 있습니까?

답변

3

뮤텍스가 갈 수있는 방법입니다 [이 답변에 따라이 올바른 방향으로 가고있는 것입니다]. 프로세스 이름 등을 사용하는 것보다 훨씬 약합니다.

그러나 뮤텍스가 가비지 수집되지 않도록해야합니다. 서비스의 경우 ("main"메소드가 완료되기보다는 이벤트 구동 방식 임), 가장 현명한 방법은이를 정적 변수에 넣는 것입니다.

서비스가 중단 될 때 뮤텍스를 삭제하십시오. 따라서 최종화 또는 그와 비슷한 것을 기다릴 필요가 없습니다.

7

K. Scott Allen은이 목적으로 Mutex를 사용할 때 a good write up을 사용하며 GC로 실행하는 데 문제가 있습니다.

나는 시스템의 모든 세션에서 실행중인 응용 프로그램의 인스턴스를 하나만 갖고 싶어

, 나는 접두사 "글로벌 \"와 글로벌 네임 스페이스로 명명 된 뮤텍스를 넣을 수 있습니다.

[STAThread] 
static void Main() 
{ 
    using(Mutex mutex = new Mutex(false, "Global\\" + appGuid)) 
    { 
     if(!mutex.WaitOne(0, false)) 
     { 
     MessageBox.Show("Instance already running"); 
     return; 
     } 

     Application.Run(new Form1()); 
    } 
} 

편집 : SO 구문 형광펜은 그대로 문자열을 좋아하지 않았다 탈출 백 슬래시 대신 @을 사용하기 문자 변경된 문자열입니다.

+0

GC.Collect()는 무엇을위한 것인가? ? – tanascius

+0

오, 나는 그 시점에서 수집 된 GC가 뮤텍스가 여전히 처분되지 않을 것이라고 발표했기 때문에 혼란을 피하기 위해 편집 할 것입니다. 그 점을 지적 해 주셔서 감사합니다. –

+0

비슷한 (하지만 다른) 문제에 대한 좋은 글. –

0

대신 WinForms 앱은 실행중인 서비스 목록을 검사하여 서비스가 실행 중인지 확인할 수 있습니다.

+0

우리는 프로세스의 휘발성 이름을 사용해야 할 것이므로이 접근법을 할인 했으므로 대안보다 훨씬 깨지기 쉬운 디자인이됩니다. –

1

서비스에서 "연결 테스트"기능을 구현할 수 있습니다. 비록 이것이 당신의 요구 사항을 위해 작동한다면 나는 모른다. winforms 시작시 서비스가 호출되었는지 확인할 수 있습니다. 간단한 WCF 계약으로 서비스를 노출 할 수 있습니다. 이 도움이

희망 ...

+0

서비스가 실행되지 않는 경우를 제외하고는 Roel에게 감사드립니다.이 접근법은 단순히 뮤텍스를 확인하는 것보다 복잡합니다. –

+0

서비스가 시작될 때 뮤텍스를 생성하고 나중에 손상을 입어 반응이 없으면 WinForms 앱이 나쁜 소식을 즉시 알게된다는 이점이 있습니다. 핑거가 핑거가 떨어지는 이유를 정확하게 신경 쓰지 않는 핑과 비교하십시오. –

관련 문제