C# 윈폼을 개발할 때 동일한 프로그램이 중복으로 실행되는 것을 방지해야 하는 경우가 있습니다.
예를 들어 일정 시간 간격으로 특정 프로세스를 실행하는 에이전트(Agent) 프로그램을 C# Winform으로 개발한다고 했을 때, 이 에이전트 프로그램은 한번만 실행되어야만 특정 프로세스가 중복으로 실행되는 것을 막을 수 있습니다.
10분 간격으로 자료를 집계하는 Agent 프로그램을 만약 여러 번 반복 적으로 실행이 된다면 10분 간격의 자료 집계는 의미가 없어 지게 됩니다. 중복으로 실행된 각 에이전트 프로그램마다 10분 간격으로 집계 프로세스가 처리된다고 한다면 계획했던 의도와는 다른 결과를 가져올 수도 있게 됩니다.
이처럼 하나의 프로그램이 한 번만 실행되고, 중복 실행되는 것을 방지하려면 어떻게 하면 될까요?
C#의 Mutex 클래스 개체를 사용하면 간단하게 처리가 가능합니다.
이번 글에서는 C# Mutex 클래스를 사용하여 동일 프로그램 중복 실행을 방지 하는 방법에 대해 알아보겠습니다.
C# Mutex를 사용하여 동일 프로그램 중복 실행 방지
▶ C#의 뮤텍스(Mutex) 클래스는 프로세스 간 동기화에 사용할 수도 있는 동기화 기본 형식입니다.
Mutex는 Mutual Exclusion의 약자로 상호 배제 즉, 공유 리소스에 대해 하나의 스레드(Thread)만이 사용 가능하도록 지원합니다.
실제 예제를 통해 C# Mutex 중복 실행 방지에 대해 설명해 보겠습니다.
1. 아래 화면은 일반적인 윈폼 프로젝트의 Program.cs 파일입니다.
  윈폼 프로젝트가 실행되면  Form1이 열기게 됩니다.

2. 윈폼 프로젝트를 빌드한 뒤 실행 파일을 실행했을 때의 화면입니다.
4. 실행할 때 마다 매번 윈폼 프로젝트가 실행되는 것을 볼 수 있습니다. 기본적으로 윈폼 프로젝트는 이와 같이 실행할 때 마다 중복으로 실행이 되어 집니다.

5. 동일한 윈폼 프로젝트가 중복 실행되는 것을 방지하기 위해 Program.cs 파일에 Mutex 클래스 개체를 사용하여 소스 코드를 변경해 주었습니다.

▼ 실제 Program.cs 소스 파일입니다.
using System; using System.Windows.Forms; namespace WindowsFormsApp1 {     static class Program     {         /// <summary>         /// 해당 애플리케이션의 주 진입점입니다.         /// </summary>         [STAThread]         static void Main()         {             bool IsCreateNew;             using (System.Threading.Mutex m = new System.Threading.Mutex(true, “WindowsFormsApp1”, out IsCreateNew))             {                 if (IsCreateNew)                 {                     // 해당 프로세스가 처음 실행된 경우                     Application.EnableVisualStyles();                     Application.SetCompatibleTextRenderingDefault(false);                     Application.Run(new Form1());                     m.ReleaseMutex();                 }                 else                 {                     // 이미 동일한 프로세스가 실행되어 있는 경우                     MessageBox.Show(“동일 프로그램이 실행중입니다.”);                 }             }         }     } }  | cs | 
6. Program.cs를 수정한 뒤 빌드하고 다시 실행했을 때의 화면입니다.
7. 처음 실행했을 때는 Form1이 열리게 됩니다. 하지만 Form1이 열려 있는 상태에서 다시 실행하면 더 이상 동일 프로그램이 중복으로 실행되지 않게 됩니다.

C# Mutex 조금 더 살펴보기
- 뮤텍스(Mutex)이 소유권을 해제하기 위해 ReleaseMutex() 메서드를 호출해 줍니다.
 - Mutex는 공유 리소스에 대한 단독 액세스 권한을 하나의 스레드에만 부여하는 동기화 기본 형식입니다.
 - 예제에서 사용한 Mutex 생성자 Mutex(Boolean, String, Boolean)에서 첫 번째 Boolean은 호출한 스레드가 뮤텍스의 초기 소유권을 가져야 할지는 나타내는 부울 값이고, 두 번째 String은 뮤텍스의 이름인 문자열, 세 번째 Boolean은 메서드에서 반환할 때 호출한 스레드에 뮤텍스의 초기 소유권이 부여되었는지를 나타내는 부울 값 입니다.
 
마무리
동일 프로그램이 중복 실행되는 것을 방지하기 위한 방법으로 C#에서 뮤텍스(Mutex)를 사용하는 방법에 알아보았습니다.
Mutex는 사용하기 간단하면서도 가장 효과적인 동일 프로그램 중복 실행 방지 구현 방법이 아닐까 생각합니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^