2009-05-02 3 views
8
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 ждет завершения одного потока. Возвратное значение - это то, что меня смущает.

ответ

15

Ожидание мьютекса означает подождать, пока вы его не приобретете.

WaitOne на Mutex вернет true, если мьютексы могут быть приобретены в заданное время. Если это не удастся, метод вернет false. Если мьютекс был приобретен, вы должны освободить мьютекс, когда закончите с ним.

Если вы можете приобрести именованный мьютекс, на данный момент его никто не владеет.

Итак, напомним. Если вы можете получить мьютекс, метод возвращает true, и вы являетесь первым или единственным экземпляром вашего приложения в отношении вашего вопроса.

Если вы не можете приобрести мьютекс, метод возвращает false, и есть другой экземпляр приложения, в настоящее время владеющий мьютексом с этим именем.

1

В MSDN описание mutex.WaitOne() заключается в следующем:

блокирует текущий поток до тех пор, тока WaitHandle не принимает сигнал.

И возвращаемое значение: истина, если текущий экземпляр получает сигнал

Так, пока приложение не запускается один раз, он не будет получать сигнал от метода mute.WaitOne(). Поток заблокирован, как говорится в описании.

Так ответить вам вопрос:

Что прикосновенность нет! (возвращение true) и наоборот.

Если вы отрицать метод mutex.WaitOne(), то вы будете проверять: если НЕ WaitOne(), это означает, что вы проверить, если WaitOne не реагирует с истинной.

Надеюсь, теперь это станет более ясным.

Смежные вопросы