diff --git a/mRemoteNGTests/Tools/DisposableActionTests.cs b/mRemoteNGTests/Tools/DisposableActionTests.cs
new file mode 100644
index 000000000..8fab6f801
--- /dev/null
+++ b/mRemoteNGTests/Tools/DisposableActionTests.cs
@@ -0,0 +1,42 @@
+using mRemoteNG.Tools;
+using NUnit.Framework;
+
+namespace mRemoteNGTests.Tools
+{
+ public class DisposableActionTests
+ {
+ [Test]
+ public void InitializerActionRunsWhenObjectIsCreated()
+ {
+ var initializerRan = false;
+ new DisposableAction(() => initializerRan = true, () => { });
+
+ Assert.That(initializerRan);
+ }
+
+ [Test]
+ public void DisposalActionRunsWhenDisposeIsCalled()
+ {
+ var disposeActionRan = false;
+ var action = new DisposableAction(() => {}, () => disposeActionRan = true);
+
+ Assert.That(disposeActionRan, Is.False);
+ action.Dispose();
+ Assert.That(disposeActionRan, Is.True);
+ }
+
+ [Test]
+ public void DisposeActionOnlyExecutedOnceWhenCallingDisposeMultipleTimes()
+ {
+ var invokeCount = 0;
+ var action = new DisposableAction(() => { }, () => invokeCount++);
+
+ action.Dispose();
+ action.Dispose();
+ action.Dispose();
+ action.Dispose();
+ action.Dispose();
+ Assert.That(invokeCount, Is.EqualTo(1));
+ }
+ }
+}
diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj
index 44703c549..deb86aa3b 100644
--- a/mRemoteNGTests/mRemoteNGTests.csproj
+++ b/mRemoteNGTests/mRemoteNGTests.csproj
@@ -176,6 +176,7 @@
+
diff --git a/mRemoteV1/Tools/DisposableAction.cs b/mRemoteV1/Tools/DisposableAction.cs
index cc5fd8ee1..19f2f86b2 100644
--- a/mRemoteV1/Tools/DisposableAction.cs
+++ b/mRemoteV1/Tools/DisposableAction.cs
@@ -9,6 +9,7 @@ namespace mRemoteNG.Tools
///
public class DisposableAction : IDisposable
{
+ private bool _isDisposed;
private readonly Action _disposeAction;
///
@@ -29,6 +30,15 @@ namespace mRemoteNG.Tools
public void Dispose()
{
+ Dispose(true);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (!disposing || _isDisposed)
+ return;
+
+ _isDisposed = true;
_disposeAction();
}
}