최근에 저는 작업 스케줄링을 위한 ConsoleApp을 작업하고 있습니다. 이 기사에서는 지금은 작업 스케줄링 부분에 대해 설명하지 않습니다. 이 기사에서는 단일 인스턴스의 작동을 보장하는 방법만 설명합니다.
ConsoleApp 실행 요구 사항
1. 시스템이 시작되면 애플리케이션을 시작합니다.
2. 각 세션에서 단일 인스턴스가 실행됩니다.
원격 데스크톱 링크를 열 때 ConsoleApp 인스턴스는 하나만 시작할 수 있습니다.
3. 시스템 내에서는 하나의 인스턴스만 실행할 수 있습니다.
여러 원격 데스크톱 링크가 열리면 ConsoleApp 인스턴스 하나만 시작할 수 있습니다.
뮤텍스
Mutex: 프로세스 간 동기화에도 사용할 수 있는 동기화 기본 요소입니다.
표시되는 MSND: http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx
공식 문서의 소개 부분에 이런 문단이 있습니다.
터미널 서비스를 실행하는 서버에서 명명된 시스템 뮤텍스는 두 가지 수준의 가시성을 가질 수 있습니다. 이름이 접두사 "Global"로 시작하면 모든 터미널 서버 세션에서 뮤텍스를 볼 수 있습니다. 이름이 접두사 "Local"로 시작하는 경우 뮤텍스는 해당 뮤텍스가 생성된 터미널 서버 세션에서만 볼 수 있습니다. 이 경우 서버의 다른 모든 터미널 서버 세션에서 동일한 이름을 가진 별도의 뮤텍스를 가질 수 있습니다. 접두사를 지정하지 않고 명명된 뮤텍스를 생성하면 접두사 "Local"이 사용됩니다. 터미널 서버 세션에서 이름 접두사만 다른 두 개의 뮤텍스는 독립적인 뮤텍스이며 이 두 뮤텍스는 터미널 서버 세션의 모든 프로세스에 표시됩니다. 즉, 접두사 이름 "Global" 및 "Local"은 프로세스와 관련된 것이 아니라 터미널 서버 세션과 관련된 뮤텍스 이름의 범위를 나타냅니다.
불행하게도 C# 예제는 발견되지 않았습니다. 이 구절은 다음과 같이 이해될 수 있습니다.
mutexName= "로컬\" +"앱 이름";
이는 생성된 세션에 대해서만 유효합니다. 즉, 새 원격 연결이 열리면 ConsoleApp 인스턴스가 다시 시작됩니다.
mutexName= "글로벌\" +"앱 이름";
모든 세션에 유효합니다. 여러 원격 링크가 열리면 첫 번째 원격 링크만 ConsoleApp 인스턴스를 성공적으로 시작합니다.
세션당 단일 인스턴스로 실행
개인 정적 무효 LocalMutex()
{
// 처음으로 뮤텍스를 생성할지 여부
bool newMutexCreated = false;
string mutexName = "Local\" + "tenghoo";
뮤텍스 뮤텍스 = null;
노력하다
{
mutex = new Mutex(false, mutexName, out newMutexCreated);
}
잡기 (예외예외)
{
Console.Write(ex.메시지);
System.Threading.Thread.Sleep(3000);
환경.종료(1);
}
// 처음으로 뮤텍스를 생성합니다.
if (newMutexCreated)
{
Console.WriteLine("프로그램이 시작되었습니다.");
//todo: 수행할 작업은 다음과 같습니다.
}
또 다른
{
Console.Write("다른 창이 이미 실행 중이며 3초 후에 자동으로 닫힙니다...");
System.Threading.Thread.Sleep(1000);
Console.Write("1");
System.Threading.Thread.Sleep(1000);
Console.Write("2");
System.Threading.Thread.Sleep(1000);
Console.Write("3");
Environment.Exit(1);//프로그램 종료
}
}
시스템 전체의 단일 인스턴스 작업
개인 정적 무효 GlobalMutex()
{
// 처음으로 뮤텍스를 생성할지 여부
bool newMutexCreated = false;
string mutexName = "Global\" + "tenghoo";
뮤텍스 뮤텍스 = null;
노력하다
{
mutex = new Mutex(false, mutexName, out newMutexCreated);
}
잡기 (예외예외)
{
Console.Write(ex.메시지);
System.Threading.Thread.Sleep(3000);
환경.종료(1);
}
// 처음으로 뮤텍스를 생성합니다.
if (newMutexCreated)
{
Console.WriteLine("프로그램이 시작되었습니다.");
//todo: 수행할 작업은 다음과 같습니다.
}
또 다른
{
Console.Write("다른 창이 이미 실행 중이며 3초 후에 자동으로 닫힙니다...");
System.Threading.Thread.Sleep(1000);
Console.Write("1");
System.Threading.Thread.Sleep(1000);
Console.Write("2");
System.Threading.Thread.Sleep(1000);
Console.Write("3");
Environment.Exit(1);//프로그램 종료
}