diff --git a/ShareX.HelpersLib/SingleInstanceManager.cs b/ShareX.HelpersLib/SingleInstanceManager.cs index 61e724bc2..2bdbccef8 100644 --- a/ShareX.HelpersLib/SingleInstanceManager.cs +++ b/ShareX.HelpersLib/SingleInstanceManager.cs @@ -34,7 +34,7 @@ namespace ShareX.HelpersLib { public class SingleInstanceManager : IDisposable { - public event EventHandler ArgumentsReceived; + public event Action ArgumentsReceived; public bool IsSingleInstance { get; private set; } public bool IsFirstInstance { get; private set; } @@ -47,18 +47,22 @@ public class SingleInstanceManager : IDisposable private readonly Mutex mutex; private CancellationTokenSource cts; + public SingleInstanceManager(string[] args) : this(true, args) + { + } + public SingleInstanceManager(bool isSingleInstance, string[] args) { IsSingleInstance = isSingleInstance; mutex = new Mutex(false, MutexName); - if (IsSingleInstance) + try { - try - { - IsFirstInstance = mutex.WaitOne(100, false); + IsFirstInstance = mutex.WaitOne(100, false); + if (IsSingleInstance) + { if (IsFirstInstance) { cts = new CancellationTokenSource(); @@ -70,22 +74,18 @@ public SingleInstanceManager(bool isSingleInstance, string[] args) RedirectArgumentsToFirstInstance(args); } } - catch (AbandonedMutexException) - { - DebugHelper.WriteLine("Single instance mutex found abandoned from another process."); - - IsFirstInstance = true; - } } - else + catch (AbandonedMutexException) { + DebugHelper.WriteLine("Single instance mutex found abandoned from another process."); + IsFirstInstance = true; } } protected virtual void OnArgumentsReceived(string[] arguments) { - ArgumentsReceived?.Invoke(this, new ArgumentsReceivedEventArgs(arguments)); + ArgumentsReceived?.Invoke(arguments); } private async Task ListenForConnectionsAsync() @@ -155,19 +155,21 @@ private void RedirectArgumentsToFirstInstance(string[] args) public void Dispose() { - cts?.Cancel(); - cts?.Dispose(); - mutex?.ReleaseMutex(); - } - } + if (cts != null) + { + cts.Cancel(); + cts.Dispose(); + } - public class ArgumentsReceivedEventArgs : EventArgs - { - public string[] Arguments { get; private set; } + if (mutex != null) + { + if (IsFirstInstance) + { + mutex.ReleaseMutex(); + } - public ArgumentsReceivedEventArgs(string[] arguments) - { - Arguments = arguments; + mutex.Dispose(); + } } } } \ No newline at end of file diff --git a/ShareX/Program.cs b/ShareX/Program.cs index af3a8ebb8..707e526fe 100644 --- a/ShareX/Program.cs +++ b/ShareX/Program.cs @@ -289,7 +289,7 @@ private static void Main(string[] args) using (SingleInstanceManager singleInstanceManager = new SingleInstanceManager(!MultiInstance, args)) { - if (singleInstanceManager.IsFirstInstance) + if (!singleInstanceManager.IsSingleInstance || singleInstanceManager.IsFirstInstance) { singleInstanceManager.ArgumentsReceived += SingleInstanceManager_ArgumentsReceived; @@ -390,13 +390,13 @@ public static void Restart(bool asAdmin = false) Application.Exit(); } - private static void SingleInstanceManager_ArgumentsReceived(object sender, ArgumentsReceivedEventArgs e) + private static void SingleInstanceManager_ArgumentsReceived(string[] arguments) { if (WaitFormLoad(5000)) { MainForm.InvokeSafe(async () => { - await UseCommandLineArgs(e.Arguments); + await UseCommandLineArgs(arguments); }); } }