2013-04-18 2 views
4

하나의 인스턴스에서만 내 응용 프로그램을 실행할 수 있도록 뮤텍스를 설정하려고합니다. (다른 게시물에 여기 제안처럼) 나는 유감스럽게도이 코드가 작동하지하나 이상의 인스턴스를 실행하지 마십시오

public partial class App : Application 
    { 

     private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9"; 

     protected override void OnStartup(StartupEventArgs e) 
     { 
      using (Mutex mutex = new Mutex(false, "Global\\" + appGuid)) 
      { 

       if (!mutex.WaitOne(0, false)) 
       { 
        MessageBox.Show("Instance already running"); 
        return; 
       } 

       base.OnStartup(e); 

       //run application code 
      } 
     } 

    } 

다음 코드를 썼다. 내 애플리케이션을 여러 인스턴스로 시작할 수 있습니다. 누구든지 내 코드에서 잘못된 점을 알고 있습니까? 감사

답변

7

당신은 응용 프로그램의 첫 번째 인스턴스를 실행 한 후 Mutex을 배치하고 있습니다. 대신 필드에 보관하고 using 블록을 사용하지 마십시오

public partial class App : Application 
{ 
    private Mutex _mutex; 
    private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9"; 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     bool createdNew; 
     // thread should own mutex, so pass true 
     _mutex = new Mutex(true, "Global\\" + appGuid, out createdNew); 
     if (!createdNew) 
     { 
      _mutex = null; 
      MessageBox.Show("Instance already running"); 
      Application.Current.Shutdown(); // close application! 
      return; 
     } 

     base.OnStartup(e); 
     //run application code 
    } 

    protected override void OnExit(ExitEventArgs e) 
    {   
     if(_mutex != null) 
      _mutex.ReleaseMutex(); 
     base.OnExit(e); 
    } 
} 

출력 매개 변수 createdNew 반환 false 뮤텍스가 이미 존재하는 경우입니다.

+1

감사합니다. 매력처럼 작동합니다. – Ofir

0

당신 였는지를 이미 실행중인 경우 확인할 수는 :

Process[] pname = Process.GetProcessesByName("YourProccessName"); 
if (pname.Length == 0) 
    Application.Exit(); 
+1

예이 가능성을 알고 있습니다. 위의 코드가 왜 작동하지 않는지 이해하고 싶습니다. 감사합니다. 어쨌든 – Ofir

관련 문제