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 }