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는 사용하기 간단하면서도 가장 효과적인 동일 프로그램 중복 실행 방지 구현 방법이 아닐까 생각합니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^