프로그래밍/C#

[C#] 프로그램 중복실행방지 (뮤텍스,프로세스개수로확인)

ss-pro 2021. 8. 22. 23:41
반응형

프로그램을 중복실행을 방지하는 방법에 대해 알아보겠습니다. 중복 실행되지 않아야 되는 서비스의 경우는 중복실행이 되지 않도록 해주어야합니다. 중복실행을 방지하는 2가지방법에 대해서 알아보도록 하겠습니다. Process클래스를 사용하여 동일한 프로세스명이 있는지 확인하여 체크하는 방법과 뮤텍스를 사용해서 동시접근이 되지 않도록 하는 방법이 있습니다.

1. 프로세스 개수로 확인하기
System.Diagnostics네임스페이스를 추가해서 Process클래스를 사용하게합니다.
Process.GetCurrentProcess().ProcessName : 현재실행하는 프로세스의 이름으로 해당프로세스가 2개이상인지 체크하여두개이상이면 중복 실행된것으로 판단합니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;           //Process 
 
namespace DuplicationRunPrevention
{
    static class Program
    {
        /// <summary>
        /// 해당 애플리케이션의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (IsExistProcess(Process.GetCurrentProcess().ProcessName))
            {
                MessageBox.Show("이미실행중입니다.");
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
 
        static bool IsExistProcess(string processName)
        {
            Process[] process = Process.GetProcesses();
            int cnt = 0;
 
            //프로세스명으로 확인해서 동일한 프로세스 개수가 2개이상인지 확인합니다. 
            //현재실행하는 프로세스도 포함되기때문에 1보다커야합니다.
            foreach (var p in process)
            {
                if (p.ProcessName == processName)
                    cnt++;
                if (cnt > 1)
                    return true;
            }
            return false;
        }
    }
}
 
 


2. 뮤텍스를 사용한 중복유무 확인
System.Threading 네임스페이스를 추가하여 Mutex를 사용한다.Mutex 생성시에 createdNew리턴값으로 이미 명명된 뮤텍스가 있는지 확인해서 동일한값으로 실행이 되어있는지 확인하여 중복유무를 판단한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;         //Mutex
 
namespace DuplicationRunPreventionMutex
{
    static class Program
    {
        /// <summary>
        /// 해당 애플리케이션의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            if (IsExistProcessMutex(Process.GetCurrentProcess().ProcessName))
            {
                MessageBox.Show("이미실행중입니다.");
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
 
        static bool IsExistProcessMutex(string processName)
        {
            bool createdNew;
 
            // createdNew  : processName로 이미 명명된 뮤텍스가 있을경우 false반환
            // 신규인경우는 true를반환한다.
            Mutex mutex = new Mutex(true, processName, out createdNew);
 
            if (createdNew == true)
                return false;
            else
                return true;
 
        }
    }
}