2013-04-26 2 views
0

사용자가 여러 인스턴스를 실행할 수 없도록하려는 .net 3.5/C#/wpf 응용 프로그램이 있습니다. 때문에 버려진 뮤텍스에 완료 대기 : 예외 : 그래서단일 인스턴스 응용 프로그램에서 AbandonedMutexException

protected override void OnStartup(StartupEventArgs e) 
{ 
    const string mutexName = "Local\\MyApp.SingleInstance"; 
    try 
    { 
     // Create a new mutex object with a unique name 
     _mutex = new Mutex(false, mutexName); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace + 
        "\n\n" + "Application Exiting…", "Exception thrown"); 
     Current.Shutdown(); 
    } 

    if (_mutex.WaitOne(0, false)) 
    { 
     base.OnStartup(e); 
    } 
    else 
    { 
     MessageBox.Show("app is already open", "Error", MessageBoxButton.OK, MessageBoxImage.Information); 
     Current.Shutdown(); 
    } 
    //...show mainwindow or load app 
} 

내 문제는 내 사용자 중 일부는이 예외를보고 있다는 것입니다 내 App.xaml.cs를에 다음을 사용합니다. 형식 : System.Threading.AbandonedMutexException

이 항목을 로컬에서 재현 할 수 없어 무슨 일이 일어나는지 파악하기가 어렵습니다.

겠습니까 내 시도/캐치가 가능하게 도와 후

finally 
{ 
    _mutex.ReleaseMutex(); 
} 

을 추가?

+1

. http://stackoverflow.com/q/635640/56778 (특히 질문의 두 번째 코드 샘플)을 참조하십시오. –

+0

감사합니다. 매우 유용합니다. 그것은 존의 대답을 설명하는 데 도움이됩니다. – danSiebes

+0

또한, 'ReleaseMutex'는 앱 종료시에만 호출되어야합니다. – jnm2

답변

0

방법에 대한 사용 : 당신은 확실히 finally` ...의`시도해야

using (var mutex = new Mutex(false, mutexName)) 
{ 
    if (mutex.WaitOne(0, false)) 
    { 
     base.OnStartup(e); 
    } 
    else 
    { 
     MessageBox.Show("app is already open", "Error", MessageBoxButton.OK, MessageBoxImage.Information); 
     Current.Shutdown(); 
    } 
} 
+1

답변 해 주셔서 감사합니다. 내 자신의 이해를 위해 생각입니다 : using 문을 사용하면 뮤텍스 개체가 제대로 처리되고 호출에 대해 걱정할 필요가 없습니다 .ReleaseMutex? – danSiebes

+0

네, 그게 정확합니다. 일반적으로'IDisposable'을 구현하면'using' 블록에 넣습니다. 그것은 물론 단순화이지만 거의 사실입니다. –

+0

-1 완전히 잘못되었습니다. 뮤텍스를 해제해야하며, WaitOne을 호출 한 동일한 스레드에서 해제해야합니다. 'Dispose'는 그렇게하지 않습니다. 실제로 사용 블록을 사용해야하지만'WaitOne' 성공 블록 안에서'try ... finally'는'finally' 블록에서 호출 된'ReleaseMutex'로 설정되어야합니다. [폐기시 뮤텍스가 출시되지 않는 이유는 무엇입니까?] (https://stackoverflow.com/questions/25432596/why-doesnt-mutex-get-released-when-disposed) – jnm2

관련 문제