public static void Run(ISingleInstanceApp app, string[] args = null) { var mutex = new Mutex(true, $"SingleInstance_Mutex_{app.Id}"); var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, $"SingleInstance_StartEvent_{app.Id}"); try { if (mutex.WaitOne(TimeSpan.Zero, true)) { var scheduler = SynchronizationContext.Current == null ? TaskScheduler.Current : TaskScheduler.FromCurrentSynchronizationContext(); WaitOrTimerCallback callback = delegate { Task.Factory.StartNew(() => app.Activate(), CancellationToken.None, TaskCreationOptions.None, scheduler); }; var registeredWaitHandle = ThreadPool.RegisterWaitForSingleObject(eventHandle, callback, null, Timeout.Infinite, false); app.Run(args); mutex.ReleaseMutex(); registeredWaitHandle.Unregister(null); } else { eventHandle.Set(); } } finally { eventHandle.Close(); eventHandle.Dispose(); mutex.Close(); mutex.Dispose(); } }
public SingleInstanceController(string id, string[] args, ISingleInstanceApp singleInstanceApp) { Identifier = id; isRunning = false; EXIT_STRING = "__EXIT__"; this.singleInstanceApp = singleInstanceApp; Mutex = new Mutex(true, id, out isOnlyInstance); if (IsOnlyInstance) { StartServer(); } else { SignalFirstInstance(args); } }