블로그 이미지
Sunny's

calendar

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

Notice

'중복방지'에 해당되는 글 1

  1. 2009.03.31 WPF에서 Mutex 사용하여 중복방지 구현하기무테
2009. 3. 31. 15:20 WPF, Silverlight
프로그램이 중복 실행되는 것을 막는 가장 일반적인 방법은 Mutex를 사용하여 프로세스를 확인하는 방법입니다.
C#에서 사용되는 방법은 msdn에도 Mutex의 예제로 아래와 같이 나와 있습니다.
msdn에 나온 Mutex의 기본 사용법을 보시고 싶으신 분은 아래 소스를 펼쳐 보시면 됩니다.

하지만 WPF에서 위에 방법을 App.xaml.cs 에 적용시켜도 원하는 데로 동작하지 않습니다.
그래서 오늘은 WPF에서 사용할 수 있는 방법을 올려드리겠습니다.
아래 예제는 뮤텍스를 사용한 중복 방지 소스를 구글링해서 힘들게 찾은 소스입니다.
제가 잘 동작하는 것은 확인 하였습니다. 이 밖에 다른 예제 소스도 보여드리겠습니다만 아래 예제를 쓰시는 것이 가장 좋습니다.

01.using System;
02.using System.Threading;
03.using System.Windows; 
04.namespace WpfKorea
05.{
06.    /// <summary>
07.    /// Interaction logic for App.xaml
08.    /// </summary>
09.    public partial class App : Application
10.    {
11.        Mutex mutex = null;
12.        protected override void OnStartup(StartupEventArgs e)
13.        {            
14.            string mutexName = "wpfkorea.com";
15.            try
16.            {                
17.                mutex = new Mutex(false, mutexName);
18.            }
19.            catch (Exception ex)
20.            {
21.                MessageBox.Show(    ex.Message + "\n\n"  +   ex.StackTrace + "\n\n"  +   "Application Exiting…",   "Exception thrown");
22.                Application.Current.Shutdown();
23.            }
24.            if (mutex.WaitOne(0, false))
25.            {
26.                base.OnStartup(e);
27.            }
28.            else
29.            {
30.                MessageBox.Show("Application already startet.", "Error", MessageBoxButton.OK, MessageBoxImage.Information);
31.                Application.Current.Shutdown();
32.            }
33.        }
34.    }
35.}


위에 예제는 OnStartUp이벤트와 Mutex의 WaitOne을 이용하여 중복방지를 구현하였습니다.



그럼 이번에는 약간 다른 방법으로 구현해 보겠습니다.
이 방법은 WPF 초기화를 C# 코드로 직접 구현하는 방식입니다.

 

01.private static bool isNew;
02.[System.STAThreadAttribute()]
03.public static void Main()
04.{
05.    using (Mutex m = new Mutex(true, "ThisIsTheStringMutexValueThatMustBeUnique", out isNew))
06.    {
07.        if (isNew)
08.        {
09.            MyWPFApplication.App app = new MyWPFApplication.App();
10.            app.InitializeComponent();
11.            app.Run();
12.        }
13.        else
14.        {
15.            MessageBox.Show("MyWPFApplication is already running!", "MyWPFApplication", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
16.        }
17.    }
18.}


이 방법을 사용하면 App.xaml의 Build Action 속성을 ApplicationDefinition 에서 Page로 변경해 주어야 합니다.
WPF가 구성해주는 진입점을 직접 작성하셔야 하므로 여러가지로 귀찮은 일이 생길 수 있을 거 같습니다.

마지막으로 소개해 드릴 방법은 프로세서의 네임 중복을 체크하는 방법입니다. 
이 방법은 잘 동작하지만 실행파일의 이름을 바꾸기만 해도 쉽게 중복 실행이 가능해 집니다.

01.public partial class App : Application
02.{
03.    public App() : base()
04.    {
05.        System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName);
06.        if (process.Length > 1)
07.        {
08.            MessageBox.Show("MyApplication is already running ...", "MyApplication Launch", MessageBoxButton.OK, MessageBoxImage.Information);
09.                this.Shutdown();
10.       }
11.    }
12.}

이런 방법들을 사용하시면 WPF에서 중복방지를 구현하실수 있습니다.
길게 읽지 않으시고 첫번째 소개해 드린 방법을 사용하시면 됩니다.
나머지는 참고만 하셔도 될 것 같습니다.

출처 : http://wpfkorea.com/?document_srl=3047#0

posted by Sunny's
prev 1 next