2011-08-09 3 views
3

20 분마다 타이머 대리인을 통해 파일을 읽고 내용을 역 직렬화 한 다음 파일을 지우는 C# Windows 서비스 응용 프로그램을 작성했습니다. 이 파일은 동일한 컴퓨터에서 실행되는 하나 이상의 클라이언트 응용 프로그램에서 작성되며, 뮤텍스를 사용하여 파일을 직렬화 및 서비스에 의해 쓰여지는 동안 파일을 "잠그는"방법을 선택했습니다.Windows 서비스에서 C# 뮤텍스를 유지하는 중

클라이언트 응용 프로그램과 서비스가 동시에 파일에 쓰려고 시도하는 드문 경우 예외를 피하기 위해이 작업을 수행하고 있습니다.

나는 (이 20 분마다 실행) 다음과 같은 C# 코드를 통해 Windows 서비스의 내부 뮤텍스를 만들 : 나는 다음을 실행하는 클라이언트 응용 프로그램에서

public void MyServiceFunction() { 
     Mutex sessMutex = new Mutex(false, "sessMutex"); 
     sessMutex.WaitOne(); 
     // Write to the file ...... 
     sessMutex.ReleaseMutex(); 
} 

:

public void MyClientFunction() { 
    Mutex mutex = Mutex.OpenExisting("sessMutex"); 
    mutex.WaitOne(); 
    // Write to the file ...... 
    mutex.ReleaseMutex(); 
} 

이제 Windows 서비스를 시작하고 몇 분 안에 클라이언트 응용 프로그램을 실행하면 모든 것이 잘 작동합니다. 그러나 몇 시간 후 나는 다음과 같은 오류가 클라이언트 응용 프로그램을 실행하려고 할 때 :

No handle of the given name exists. 

내 질문은, 내가이 발생하고 "지속"뮤텍스에서이 오류를 방지 할 방법에 대해 설명합니다.

뮤텍스를 Windows 서비스 클래스의 속성으로 저장하면됩니까? 내가 찾고있는 기능을 달성하기 위해 뮤텍스를 적절한 방법으로 사용하고 있습니까?

미리 도움 주셔서 감사합니다.

답변

2

왜 뮤텍스를 클라이언트에서 다르게 취급하는지 이해가되지 않습니다.
그것은 두 프로그램에서 동일한 코드를해야합니다 :

Mutex sessMutex = new Mutex(false, "sessMutex"); 
sessMutex.WaitOne(); 
// Write to the file ...... 
sessMutex.ReleaseMutex(); 
  1. 가 뮤텍스를 생성 - 뮤텍스가 이미 시스템에 존재하는 경우, 이것은 기존의 뮤텍스를 반환합니다!
+0

내가 볼

  • 릴리스 잠금을 파일로
  • 쓰기 잠금을 시도 ... 나는 대답에 대한 감사, 스레딩에 약간의 새로운 해요! 그것은 많은 도움이되었습니다! –

  • 0

    명백하게 서비스는 뮤텍스를 생성하고 잠그고 파일 조작을 시작한 다음 해제합니다. 그러면 해당 메소드가 범위를 잃 자마자 가비지 수집을받을 수 있습니다. 결과적으로, 클라이언트에서 뮤텍스가 여전히 있다고 가정하는 것 같습니다. 서비스 범위에 저장하는 것이 효과적 일 수 있지만 서비스가 어떤 이유에서든 종료되면 클라이언트는 여전히 그 예외를 throw 할 수 있습니다. 귀하의 고객은 뮤텍스가 아직 있는지 확인해야합니다. 추신 : 다음 그렇지 않다면, 귀하의 서비스는 아마도 또한 아닙니다.

    관련 문제