posted by 방랑군 2012. 1. 21. 21:27
C#을 다루다보면 간혹 응용 프로그램의 중복 실행을 방지해야하는 경우가 있습니다.

특히, 소켓 프로그램의 경우 중복 실행이 될 경우 포트 충돌 등으로 오류가 발생할 소지가 있어 프로그램 실행시 중복 실행을 방지하는 알고리즘은 필수라고 생각이 됩니다.

필자의 경우는 제작한 프로그램이 트래이 아이콘에 등록되다 보니 사용자들이 간혹 실수로 프로그램을 다시 실행하는 경우가 종종 있어서 Mutex를 사용하여 중복실행을 방지하고 있습니다.

프로세스를 찾아서 하는 방식도 있지만 여기서 Mutex를 이용하는 방법을 소개하고자 합니다.

Mutex 개념
    Mutex는 스레드 동기화의 한 방식으로 공유 리소스를 하나의 스레드가 단독으로 액세스할 수 있도록 합니다. 즉, 스레드가 뮤텍스를 가져오면 첫 번째 스레드가 뮤텍스를 해제할 때까지 해당 뮤텍스를 가져오려는 두 번째 스레드는 일시 중단(대기)됩니다.

중복 실행 방지 원리
    중복 실행 방지의 경우는 호출한 스레드가 초기 소유권를 가지도록 설정하여 Mutex 생성시 초기 소유권이 부여되었는지의 여부에 따라 실행과 중단을 결정합니다.

  • 소유권이 부여된 경우라면 사용중인 스레드가 없으므로 프로그램 가동
  • 소유권이 부여되지 않은 경우라면 이미 다른 스레드가 사용 중이므로 프로그램 종료

각 방식에 따라 장단점이 있지만 Mutex의 경우 간결하고 코드가 짧아 프로그램에 좋을 듯 합니다.
  • Mutex를 사용하기 위해서는 System.Threading 네임 스페이스를 추가합니다.
  • Main함수에 알고리즘을 구현합니다.

1. Mutex 함수 설명


    Name Space

    • System.Threading

      public Mutex(	bool initiallyOwned,	string name,	out bool createdNew  )
    Parameters
    • bool initiallyOwned : 호줄하는 쓰레드가 뮤텍스의 초기 소유권을 갖는지를 지정
    • string name : 뮤텍스 이름
    • out bool createdNew : 소유권 부여 여부

2. C# 프로그램 코드


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//Program.CS
//namespace에 아래 추가
using System.Threading;
[STAThread]
static void Main()
{
// 기존 코드 주석 처리
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
bool bNew;
Mutex mutex = new Mutex(true, "MutexName", out bNew);
if(bNew)
{
// 소유권이 부여
// 즉 해당 프로그램이 실행되고 있지 않은 경우
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
// 뮤텍스 릴리즈
mutex.ReleaseMutex();
}
else
{
// 소유권이 부여되지 않음
MessageBox.Show("이미실행중입니다.");
Application.Exit();
}
}
C# 프로그램 중복 실행 방지 Mutex / Using a mutex to prevent multiple application from running
http://all4cs.tistory.com - 두그미의 사는 이야기

'강좌 > C#' 카테고리의 다른 글

VB.NET and C# 의 비교문서  (0) 2012.01.21
C# 으로 만든 DLL asp에서 사용  (0) 2012.01.21
.Net single-instance application without activation  (0) 2012.01.21
C# 사운드 재생  (1) 2012.01.21
SELECT 함수  (0) 2012.01.19