Following sample uses a mutex for multiple processes on the same system -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace CSMarkusMutex
{
class Program
{
static void Main(string[] args)
{
bool isInitialOwner;
using (Mutex mutex = new Mutex(false, "MyUniqueIdApp03122021", out isInitialOwner))
{
bool hasHandle = false;
bool bContinue = true;
Console.WriteLine("Initial owner is {0}", isInitialOwner);
while (bContinue)
{
try
{
Console.WriteLine("Acquiring Mutex");
hasHandle = mutex.WaitOne(3000);
if (hasHandle)
{
Console.WriteLine("I Own the Mutex");
Console.WriteLine("Continue? Y/N");
if(Console.ReadKey().Key == ConsoleKey.N)
{
bContinue = false;
}
Console.Write('\n');
}
else
{
Console.WriteLine("Another app instance is running.");
}
}
catch (AbandonedMutexException e)
{
hasHandle = true;
Console.WriteLine("AbandomedMutexException : {0}", e.Message);
Console.WriteLine("We shouldn't be here. Protected resource could be corrupted!");
}
finally
{
if (hasHandle)
{
mutex.ReleaseMutex();
hasHandle = false;
}
}
}
}
}
}
}