static Mutex mutex = new Mutex (false, "oreilly.com OneAtATimeDemo");
static void Main()
{
// Wait a few seconds if contended, in case another instance
// of the program is still in the process of shutting down.
if (!mutex.WaitOne (TimeSpan.FromSeconds (3), false))
{
Console.WriteLine ("Another instance of the app is running. Bye!");
return;
}
try
{
Console.WriteLine ("Running. Press Enter to exit");
Console.ReadLine();
}
finally { mutex.ReleaseMutex(); }
}
http://www.albahari.com/nutshell/ch20.aspxИспользование WaitOne() Метод
В этом коде:
if(mutex.WaitOne(TimeSpan.Zero, true))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
mutex.ReleaseMutex();
}
else
{
MessageBox.Show("only one instance at a time");
}
http://sanity-free.org/143/csharp_dotnet_single_instance_application.html
Там нет инверсии, если/BOOL.
Если waitone() истинно, значит ли это, что экземпляр уже запущен? Если true, то текущий поток будет заблокирован, что означало бы, что два процесса, вызывающие одно и то же приложение, остановятся?
Мое понимание заключается в следующем:
// Don't block the thread while executing code.
//Let the code finish and then signal for another process to enter
Что прикосновенность нет! (возвращение true) и наоборот. Или, другими словами, что происходит в любом случае?
Я знаю waitAll, например, ждет завершения всех потоков. Джон Скит показал хороший пример этого на своем сайте, который застрял у меня в голове (кредит на его объяснения). Поэтому, очевидно, waitOne ждет завершения одного потока. Возвратное значение - это то, что меня смущает.