개발/C#

[팁] C# 프로그램 중복실행 방지

FA1976 2018. 2. 6. 15:22

해봤는데 제일 아래껏만 제대로 작동됨. 

Mutex를 이용한 프로세스 통제 

실행파일을 여러 번 실행하면 여러 개의 다른 프로세스들이 생성되는데 만약 해당 머시에서 오직 한 프로세스만 실행되도록하길 원한다면, 일반적으로 사용되는 한 방법으로 Mutex를 사용 할 수 있다. Mutex는 프로세스간 동기화 (Sychronization)을 위해 사용되는데,  .NET Framework에는 System.Threading.Mutex라는 클래스가 구현되어 있다.

  1. //뮤텍스 생성  
  2. Mutex m = new Mutex();  
  3. //뮤텍스를 획득할 때까지 대기  
  4. m.WaitOne();  
  5. //뮤텍스 해제  
  6. m.ReleaseMutext();  

단일 프로세스만 실행 예제 

아래는 머신에서 오직 한 프로세스만 사용하기 위한 예제이다. 머신 전체적으로 한 프로세스만 뜨게 하귀해, 고유의 Mutex명을 체크할 필요가 있는데, 이를 위해 GUID ( Globally Unique Idenrtifier)를 사용하였다. 처음 프로세스가 먼저 Mutex를 획득한 후에는, 그 프로세스가 죽기 전에는 머신 전체적으로 다른 프로세스가 Mutex를 획득할 수 없다는 점을 이요하여 잠시 (1초) 체크해 보고 이미 다른 프로세스가 Mutex를 가지고 있으면, 프로세스를 중단시키다.
GUID는 사용자가 임의적으로 명시 할 수 있다.

  1. using System;  
  2. using System.Windows.Forms;  
  3. using System.Threading;  
  4.   
  5. namespace WindowsFormsApplication1  
  6. {  
  7.     static class Program  
  8.     {  
  9.         [STAThread]  
  10.         static void Main()  
  11.         {  
  12.             // GUID를 뮤텍스명으로 사용  
  13.               
  14.             //string mtxName = "4AD31D94-659B-44A7-9277-1DD793E415D1";   
  15.               
  16.             // GUID 대신 사용자 임의대로 뮤텍스 이름 사용  
  17.             string mtxName = "Metashower";  
  18.             Mutex mtx = new Mutex(true, mtxName);  
  19.   
  20.             // 1초 동안 뮤텍스를 획득하려 대기  
  21.             TimeSpan tsWait = new TimeSpan(0, 0, 1);  
  22.             bool success = mtx.WaitOne(tsWait);  
  23.   
  24.             // 실패하면 프로그램 종료  
  25.             if (!success)  
  26.             {  
  27.                 MessageBox.Show("이미실행중입니다.");  
  28.                 return;  
  29.                   
  30.             }  
  31.   
  32.             // 성공하면 폼 실행  
  33.             Application.EnableVisualStyles();  
  34.             Application.SetCompatibleTextRenderingDefault(false);  
  35.             Application.Run(new Form1());  
  36.         }  
  37.     }  
  38. }  


다음처럼 TimeSpan을 사용하지 않고 바로 사용 할수도 있다. 

  1. static void Main()  
  2. {  
  3.   
  4.       bool bnew;  
  5.       Mutex mutex = new Mutex(true"MutexName"out bnew);  
  6.       if(bnew)  
  7.       {  
  8.           Application.EnableVisualStyles();  
  9.           Application.SetCompatibleTextRenderingDefault(false);  
  10.           Application.Run(new Form1());  
  11.           mutex.ReleaseMutex();  
  12.       }  
  13.       else  
  14.       {  
  15.           MessageBox.Show("프로그램이 실행중입니다.");  
  16.           Application.Exit();  
  17.       }  
  18.          
  19.  }