Code refactoring

This commit is contained in:
Jaex 2024-03-14 05:34:25 +03:00
parent 742f1af7d9
commit e49158120b
2 changed files with 29 additions and 27 deletions

View file

@ -34,7 +34,7 @@ namespace ShareX.HelpersLib
{ {
public class SingleInstanceManager : IDisposable public class SingleInstanceManager : IDisposable
{ {
public event EventHandler<ArgumentsReceivedEventArgs> ArgumentsReceived; public event Action<string[]> ArgumentsReceived;
public bool IsSingleInstance { get; private set; } public bool IsSingleInstance { get; private set; }
public bool IsFirstInstance { get; private set; } public bool IsFirstInstance { get; private set; }
@ -47,18 +47,22 @@ public class SingleInstanceManager : IDisposable
private readonly Mutex mutex; private readonly Mutex mutex;
private CancellationTokenSource cts; private CancellationTokenSource cts;
public SingleInstanceManager(string[] args) : this(true, args)
{
}
public SingleInstanceManager(bool isSingleInstance, string[] args) public SingleInstanceManager(bool isSingleInstance, string[] args)
{ {
IsSingleInstance = isSingleInstance; IsSingleInstance = isSingleInstance;
mutex = new Mutex(false, MutexName); mutex = new Mutex(false, MutexName);
if (IsSingleInstance) try
{ {
try IsFirstInstance = mutex.WaitOne(100, false);
{
IsFirstInstance = mutex.WaitOne(100, false);
if (IsSingleInstance)
{
if (IsFirstInstance) if (IsFirstInstance)
{ {
cts = new CancellationTokenSource(); cts = new CancellationTokenSource();
@ -70,22 +74,18 @@ public SingleInstanceManager(bool isSingleInstance, string[] args)
RedirectArgumentsToFirstInstance(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; IsFirstInstance = true;
} }
} }
protected virtual void OnArgumentsReceived(string[] arguments) protected virtual void OnArgumentsReceived(string[] arguments)
{ {
ArgumentsReceived?.Invoke(this, new ArgumentsReceivedEventArgs(arguments)); ArgumentsReceived?.Invoke(arguments);
} }
private async Task ListenForConnectionsAsync() private async Task ListenForConnectionsAsync()
@ -155,19 +155,21 @@ private void RedirectArgumentsToFirstInstance(string[] args)
public void Dispose() public void Dispose()
{ {
cts?.Cancel(); if (cts != null)
cts?.Dispose(); {
mutex?.ReleaseMutex(); cts.Cancel();
} cts.Dispose();
} }
public class ArgumentsReceivedEventArgs : EventArgs if (mutex != null)
{ {
public string[] Arguments { get; private set; } if (IsFirstInstance)
{
mutex.ReleaseMutex();
}
public ArgumentsReceivedEventArgs(string[] arguments) mutex.Dispose();
{ }
Arguments = arguments;
} }
} }
} }

View file

@ -289,7 +289,7 @@ private static void Main(string[] args)
using (SingleInstanceManager singleInstanceManager = new SingleInstanceManager(!MultiInstance, args)) using (SingleInstanceManager singleInstanceManager = new SingleInstanceManager(!MultiInstance, args))
{ {
if (singleInstanceManager.IsFirstInstance) if (!singleInstanceManager.IsSingleInstance || singleInstanceManager.IsFirstInstance)
{ {
singleInstanceManager.ArgumentsReceived += SingleInstanceManager_ArgumentsReceived; singleInstanceManager.ArgumentsReceived += SingleInstanceManager_ArgumentsReceived;
@ -390,13 +390,13 @@ public static void Restart(bool asAdmin = false)
Application.Exit(); Application.Exit();
} }
private static void SingleInstanceManager_ArgumentsReceived(object sender, ArgumentsReceivedEventArgs e) private static void SingleInstanceManager_ArgumentsReceived(string[] arguments)
{ {
if (WaitFormLoad(5000)) if (WaitFormLoad(5000))
{ {
MainForm.InvokeSafe(async () => MainForm.InvokeSafe(async () =>
{ {
await UseCommandLineArgs(e.Arguments); await UseCommandLineArgs(arguments);
}); });
} }
} }