Преглед на файлове

Add AsyncDisposable.Create.

Bart De Smet преди 8 години
родител
ревизия
fdd302163a
променени са 1 файла, в които са добавени 32 реда и са изтрити 0 реда
  1. 32 0
      AsyncRx.NET/System.Reactive.Async/System/Reactive/Disposables/AsyncDisposable.cs

+ 32 - 0
AsyncRx.NET/System.Reactive.Async/System/Reactive/Disposables/AsyncDisposable.cs

@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the Apache 2.0 License.
+// See the LICENSE file in the project root for more information. 
+
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace System.Reactive.Disposables
+{
+    public static class AsyncDisposable
+    {
+        public static IAsyncDisposable Create(Func<Task> dispose)
+        {
+            if (dispose == null)
+                throw new ArgumentNullException(nameof(dispose));
+
+            return new AnonymousAsyncDisposable(dispose);
+        }
+
+        private sealed class AnonymousAsyncDisposable : IAsyncDisposable
+        {
+            private Func<Task> _dispose;
+
+            public AnonymousAsyncDisposable(Func<Task> dispose)
+            {
+                _dispose = dispose;
+            }
+
+            public Task DisposeAsync() => Interlocked.Exchange(ref _dispose, null)?.Invoke() ?? Task.CompletedTask;
+        }
+    }
+}