문제

좋아, 그래서 C# 애플리케이션을 만들고 설치 프로그램을 만들어 내 컴퓨터에 설치하는 작업을 수행했습니다.

문제는 사용자가 응용 프로그램 exe를 두 번 열면 응용 프로그램 실행의 두 인스턴스가 있다는 것입니다. 나는 신청서의 한 가지 인스턴스 만 언제든지 실행되기를 원합니다. 어떻게해야합니까?

당신의 도움을 주셔서 감사합니다,

도움이 되었습니까?

해결책

이것의 일반적인 기술은 Mutex 응용 프로그램 시작시 그 존재를 확인하십시오.

보다 이것 또는 이것.

DDJ의 코드 :

class App : Form
{
    Mutex mutex;

    App()
    {
        Text = "Single Instance!";
        mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
        if (!mutex.WaitOne(0, false)) 
        {
            mutex.Close();
            mutex = null;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            mutex.ReleaseMutex();
        base.Dispose(disposing);
    }

    static void Main()
    {
        App app = new App();
        if (app.mutex != null) Application.Run(app);
        else MessageBox.Show("Instance already running");
    }
}

다른 팁

나는 이것 으로이 문제를 해결했다

[STAThread]
 static void Main()
    {

        Process[] result = Process.GetProcessesByName("ApplicationName");
        if (result.Length > 1)
        {
            MessageBox.Show("There is already a instance running.", "Information");
            System.Environment.Exit(0);
        }
        // here normal start 
    }

간단하지만 더 나은 솔루션을 확인할 시간이 거의 없었습니다.

감사합니다 Messrs. 앨런 그리고 파월:

    static void Main() 
    {
        using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
            if (!mutex.WaitOne(0, false)) {
                string processName = GetProcessName();
                BringOldInstanceToFront(processName);
            }
            else {
                GC.Collect();
                Application.Run(new Voting());
            }
        }
    }

    private static void BringOldInstanceToFront(string processName) {
        Process[] RunningProcesses = Process.GetProcessesByName(processName);
        if (RunningProcesses.Length > 0) {
            Process runningProcess = RunningProcesses[0];
            if (runningProcess != null) {
                IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
                NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
            NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
            }
        }
    }

나는 당신이 운영하는 환경을 모르지만 '단일 인스턴스 응용 프로그램'에 대해 명심해야 할 것은 단일 인스턴스를 정의하는 방법입니다. 공통 데이터 소스를 사용하여 여러 워크 스테이션에서 응용 프로그램을 동시에 실행할 수있는 경우 문제가 있습니까? 마찬가지로, 하나 이상의 사용자가 동일한 컴퓨터에 로그인하는 터미널 서비스 상황 (또는 "Run As"상황)은 어떻습니까? -컴퓨터? 아니면 단순히 사용자 당 하나의 인스턴스가 되어도 괜찮습니까?

이것에 대한 대답은 당신을 한 방향으로 다른 방향으로 인도 할 수 있습니다. 예를 들어, 범위가 컴퓨터 그룹 인 '단일 인스턴스'응용 프로그램이 있습니다. 해당 워크 스테이션 그룹 내에서 한 명의 사용자 만 허용됩니다. 우리는 현재 연결된 사용자를 추적하는 공유 데이터 소스에 테이블을 가지고이를 관리했습니다. 테이블이 항상 100% 정확한지 확인해야하므로 유지 보수 문제입니다. 워크 스테이션에서 예상치 못한 정전과 같은 것을 처리하고 해당 테이블에 "가짜"기록을 남겨두면 신중한 처리가 필요했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top