diff --git a/CodeJam.Main.Tests/DisposableExtensionsTests.cs b/CodeJam.Main.Tests/DisposableExtensionsTests.cs
index 32c84735..86d68457 100644
--- a/CodeJam.Main.Tests/DisposableExtensionsTests.cs
+++ b/CodeJam.Main.Tests/DisposableExtensionsTests.cs
@@ -60,6 +60,20 @@ public static void DisposeAllMustCollectAllExceptions()
}
#if NETSTANDARD21_OR_GREATER || NETCOREAPP30_OR_GREATER
+ [Test]
+ public static async Task DisposeAsyncMustCallDiposeOnce()
+ {
+ const int expectedDisposeCount = 1;
+
+ int actualDisposeCount = 0;
+
+ var objectForDispose = Disposable.Create(() => ++actualDisposeCount);
+
+ await objectForDispose.DisposeAsync();
+
+ Assert.AreEqual(expectedDisposeCount, actualDisposeCount);
+ }
+
[Test]
public static void DisposeAsyncMustNotBlockThread()
{
diff --git a/CodeJam.Main/DisposableExtensions.cs b/CodeJam.Main/DisposableExtensions.cs
index 4280271b..166e21e4 100644
--- a/CodeJam.Main/DisposableExtensions.cs
+++ b/CodeJam.Main/DisposableExtensions.cs
@@ -1,8 +1,7 @@
using System;
using System.Collections.Generic;
-#if NETSTANDARD21_OR_GREATER || NETCOREAPP30_OR_GREATER
using System.Threading.Tasks;
-#endif
+
using CodeJam.Internal;
using JetBrains.Annotations;
@@ -67,12 +66,12 @@ public static void DisposeAll(
/// Calls DisposeAsync if implements , otherwise
/// calls
///
- public static ValueTask DisposeAsync(this IDisposable disposable)
+ public static async ValueTask DisposeAsync(this IDisposable disposable)
{
Code.NotNull(disposable, nameof(disposable));
if (disposable is IAsyncDisposable asyncDisposable)
- return asyncDisposable.DisposeAsync();
- return new ValueTask(Task.Run(() => disposable.Dispose()));
+ await asyncDisposable.DisposeAsync();
+ await new ValueTask(Task.Run(() => disposable.Dispose()));
}
#endif
}