В последнее время я работаю над ConsoleApp для планирования заданий. В этой статье пока не обсуждается часть планирования заданий (я напишу об этом позже).
Требования к запуску ConsoleApp
1. Запустите приложение при запуске системы;
2. Один экземпляр, работающий в каждом сеансе;
При открытии ссылки на удаленный рабочий стол разрешен запуск только одного экземпляра ConsoleApp.
3. В системе может работать только один экземпляр;
При открытии нескольких ссылок на удаленный рабочий стол разрешен запуск только одного экземпляра ConsoleApp.
Мьютекс
Мьютекс: примитив синхронизации, который также можно использовать для синхронизации между процессами.
Видимый MSND: http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx .
Во введении к официальному документу есть этот абзац
На сервере, на котором запущены службы терминалов, именованный системный мьютекс может иметь два уровня видимости. Если имя начинается с префикса «Global», мьютекс виден во всех сеансах сервера терминалов. Если имя начинается с префикса «Локальный», мьютекс виден только в том сеансе сервера терминалов, в котором он был создан. В этом случае вы можете иметь отдельный мьютекс с тем же именем в каждом втором сеансе терминального сервера на сервере. Если именованный мьютекс создается без указания префикса, он будет принимать префикс «Локальный». В сеансе сервера терминалов два мьютекса, которые отличаются только префиксом имени, являются независимыми мьютексами, и эти два мьютекса видны всем процессам в сеансе сервера терминалов. То есть: имена префиксов «Глобальный» и «Локальный» указывают область действия имени мьютекса относительно сеанса терминального сервера (а не относительно процесса).
К сожалению, пример C# не найден. Этот отрывок можно понимать так:
mutexName = "Local\" +"AppName";
Он действителен только для сеанса, в котором он был создан, а это означает, что при открытии нового удаленного подключения экземпляр ConsoleApp будет запущен снова.
mutexName = "Global\" +"AppName";
Действительно для всех сеансов. При открытии нескольких удаленных ссылок только первая удаленная ссылка успешно запустит экземпляр ConsoleApp.
Запускать как один экземпляр за сеанс
частная статическая пустота LocalMutex()
{
// Создавать ли мьютекс впервые
bool newMutexCreated = ложь;
string mutexName = "Local\" + "tenghoo";
Мьютекс мьютекс = ноль;
пытаться
{
мьютекс = новый мьютекс (ложь, имя мьютекса, выход newMutexCreated);
}
поймать (Исключение ex)
{
Console.Write(ex.Message);
System.Threading.Thread.Sleep(3000);
Среда.Выход(1);
}
// Создаем мьютекс в первый раз
если (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 = ложь;
string mutexName = "Global\" + "tenghoo";
Мьютекс мьютекс = ноль;
пытаться
{
мьютекс = новый мьютекс (ложь, имя мьютекса, выход newMutexCreated);
}
поймать (Исключение ex)
{
Console.Write(ex.Message);
System.Threading.Thread.Sleep(3000);
Среда.Выход(1);
}
// Создаем мьютекс в первый раз
если (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);//Выходим из программы
}