C# – Using waitone() method

c++

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

In this code:

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

There is no inversion of the if/bool.

If waitone() is true, does that mean an instance is already running? If true is returned, the current thread will be blocked which would mean two processes calling the same app will both halt?

My understanding is as follows:

// Don't block the thread while executing code. 
//Let the code finish and then signal for another process to enter

What is the implication of no ! (returning true) and vice versa. Or in other words, what happens either way?

I know waitAll for example, waits for all threads to finish. Jon Skeet showed a good example of this on his site, which has stuck in my mind (credit to his explanations). So obviously waitOne waits for one thread to finish. The return value is what confuses me.

Best Solution

To wait on a mutex means to wait until you can acquire it.

WaitOne on a Mutex will return true if the mutex could be acquired in the given time. If it couldn't, the method will return false. If the mutex was acquired, it's your responsibility to release the mutex when you're done with it.

If you can acquire a named mutex, nobody else owns it at the moment.

So, to recap. If you can acquire the mutex, the method returns true and you're the first/only instance of your application, in regards to your question.

If you cannot acquire the mutex, the method returns false and there is another application instance currently owning the mutex by that name.