C# Mutex 클래스를 사용하여 동일 프로그램 중복 실행을 방지 하는 방법

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이 열기게 됩니다.

C# Mutex 클래스를 사용하여 동일 프로그램 중복 실행을 방지 하는 방법 1

2. 윈폼 프로젝트를 빌드한 뒤 실행 파일을 실행했을 때의 화면입니다.

4. 실행할 때 마다 매번 윈폼 프로젝트가 실행되는 것을 볼 수 있습니다. 기본적으로 윈폼 프로젝트는 이와 같이 실행할 때 마다 중복으로 실행이 되어 집니다.

C# Mutex 클래스를 사용하여 동일 프로그램 중복 실행을 방지 하는 방법 2

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

C# Mutex 클래스를 사용하여 동일 프로그램 중복 실행을 방지 하는 방법 3

▼ 실제 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 클래스를 사용하여 동일 프로그램 중복 실행을 방지 하는 방법 4

C# Mutex 조금 더 살펴보기

  • 뮤텍스(Mutex)이 소유권을 해제하기 위해 ReleaseMutex() 메서드를 호출해 줍니다.
  • Mutex는 공유 리소스에 대한 단독 액세스 권한을 하나의 스레드에만 부여하는 동기화 기본 형식입니다.
  • 예제에서 사용한 Mutex 생성자 Mutex(Boolean, String, Boolean)에서 첫 번째 Boolean은 호출한 스레드가 뮤텍스의 초기 소유권을 가져야 할지는 나타내는 부울 값이고, 두 번째 String은 뮤텍스의 이름인 문자열, 세 번째 Boolean은 메서드에서 반환할 때 호출한 스레드에 뮤텍스의 초기 소유권이 부여되었는지를 나타내는 부울 값 입니다.

마무리

동일 프로그램이 중복 실행되는 것을 방지하기 위한 방법으로 C#에서 뮤텍스(Mutex)를 사용하는 방법에 알아보았습니다.

Mutex는 사용하기 간단하면서도 가장 효과적인 동일 프로그램 중복 실행 방지 구현 방법이 아닐까 생각합니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기