浏览代码

Switch Async Rx to use proper IAsyncDisposable.

Bart De Smet 5 年之前
父节点
当前提交
8a85fe14b0
共有 45 个文件被更改,包括 260 次插入98 次删除
  1. 1 1
      AsyncRx.NET/ApiCompare/ApiCompare.csproj
  2. 1 1
      AsyncRx.NET/Playground/Playground.csproj
  3. 1 1
      AsyncRx.NET/System.Reactive.Async.Concurrency/System.Reactive.Async.Concurrency.csproj
  4. 25 5
      AsyncRx.NET/System.Reactive.Async.Concurrency/System/Reactive/Concurrency/AsyncScheduler.cs
  5. 2 2
      AsyncRx.NET/System.Reactive.Async.Concurrency/System/Reactive/Concurrency/AsyncSchedulerBase.cs
  6. 2 2
      AsyncRx.NET/System.Reactive.Async.Concurrency/System/Threading/Tasks/TaskAwaitable.cs
  7. 155 0
      AsyncRx.NET/System.Reactive.Async.Concurrency/System/Threading/Tasks/ValueTaskAwaitable.cs
  8. 2 2
      AsyncRx.NET/System.Reactive.Async.Core/System.Reactive.Async.Core.csproj
  9. 1 1
      AsyncRx.NET/System.Reactive.Async.Core/System/Reactive/AsyncObservableBase.cs
  10. 2 2
      AsyncRx.NET/System.Reactive.Async.Disposables/System.Reactive.Async.Disposables.csproj
  11. 5 5
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/AsyncDisposable.cs
  12. 2 2
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/CancellationAsyncDisposable.cs
  13. 2 2
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/CompositeAsyncDisposable.cs
  14. 3 3
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/RefCountAsyncDisposable.cs
  15. 1 1
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/SerialAsyncDisposable.cs
  16. 3 3
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/SingleAssignmentAsyncDisposable.cs
  17. 4 4
      AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/StableCompositeAsyncDisposable.cs
  18. 2 2
      AsyncRx.NET/System.Reactive.Async.Interfaces/System.Reactive.Async.Interfaces.csproj
  19. 0 13
      AsyncRx.NET/System.Reactive.Async.Interfaces/System/IAsyncDisposable.cs
  20. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System.Reactive.Async.Linq.csproj
  21. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Joins/AsyncJoinObserver.cs
  22. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/Amb.cs
  23. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/Catch.cs
  24. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/Concat.cs
  25. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/For.cs
  26. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/ForEachAsync.cs
  27. 15 15
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEvent.Generated.cs
  28. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEvent.Generated.tt
  29. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEvent.cs
  30. 2 2
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEventPattern.cs
  31. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/OnErrorResumeNext.cs
  32. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/ToAsyncObservable.cs
  33. 1 1
      AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Subjects/ConnectableAsyncObservable.cs
  34. 2 2
      AsyncRx.NET/System.Reactive.Async.Subjects/System.Reactive.Async.Subjects.csproj
  35. 1 1
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/FastImmediateAsyncObserver.cs
  36. 1 1
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/ScheduledAsyncObserver.cs
  37. 1 1
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/ScheduledAsyncObserverBase.cs
  38. 1 1
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/AsyncAsyncSubject.cs
  39. 1 1
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/BehaviorAsyncSubject.cs
  40. 2 2
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/ReplayAsyncSubject.cs
  41. 1 1
      AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/SimpleAsyncSubject.cs
  42. 2 2
      AsyncRx.NET/System.Reactive.Async/System.Reactive.Async.csproj
  43. 2 2
      AsyncRx.NET/System.Reactive.Bcl/System.Reactive.Bcl.csproj
  44. 1 1
      AsyncRx.NET/System.Reactive.Bcl/System/Threading/AsyncQueueLock.cs
  45. 2 2
      AsyncRx.NET/System.Reactive.Shared/System.Reactive.Shared.csproj

+ 1 - 1
AsyncRx.NET/ApiCompare/ApiCompare.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
AsyncRx.NET/Playground/Playground.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>netcoreapp2.0</TargetFramework>
+    <TargetFramework>netcoreapp3.1</TargetFramework>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Concurrency/System.Reactive.Async.Concurrency.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 25 - 5
AsyncRx.NET/System.Reactive.Async.Concurrency/System/Reactive/Concurrency/AsyncScheduler.cs

@@ -52,7 +52,27 @@ namespace System.Reactive.Concurrency
             return new TaskAwaitable<T>(task, false, scheduler, token);
         }
 
-        public static async Task Delay(this IAsyncScheduler scheduler, TimeSpan dueTime, CancellationToken token = default(CancellationToken))
+        public static IAwaitable RendezVous(this ValueTask task, IAsyncScheduler scheduler) => RendezVous(task, scheduler, CancellationToken.None);
+
+        public static IAwaitable RendezVous(this ValueTask task, IAsyncScheduler scheduler, CancellationToken token)
+        {
+            if (scheduler == null)
+                throw new ArgumentNullException(nameof(scheduler));
+
+            return new ValueTaskAwaitable(task, false, scheduler, token);
+        }
+
+        public static IAwaitable<T> RendezVous<T>(this ValueTask<T> task, IAsyncScheduler scheduler) => RendezVous(task, scheduler, CancellationToken.None);
+
+        public static IAwaitable<T> RendezVous<T>(this ValueTask<T> task, IAsyncScheduler scheduler, CancellationToken token)
+        {
+            if (scheduler == null)
+                throw new ArgumentNullException(nameof(scheduler));
+
+            return new ValueTaskAwaitable<T>(task, false, scheduler, token);
+        }
+
+        public static async ValueTask Delay(this IAsyncScheduler scheduler, TimeSpan dueTime, CancellationToken token = default)
         {
             if (scheduler == null)
                 throw new ArgumentNullException(nameof(scheduler));
@@ -79,7 +99,7 @@ namespace System.Reactive.Concurrency
             }
         }
 
-        public static async Task Delay(this IAsyncScheduler scheduler, DateTimeOffset dueTime, CancellationToken token = default(CancellationToken))
+        public static async ValueTask Delay(this IAsyncScheduler scheduler, DateTimeOffset dueTime, CancellationToken token = default)
         {
             if (scheduler == null)
                 throw new ArgumentNullException(nameof(scheduler));
@@ -106,7 +126,7 @@ namespace System.Reactive.Concurrency
             }
         }
 
-        public static async Task ExecuteAsync(this IAsyncScheduler scheduler, Func<CancellationToken, Task> action, CancellationToken token = default(CancellationToken))
+        public static async ValueTask ExecuteAsync(this IAsyncScheduler scheduler, Func<CancellationToken, ValueTask> action, CancellationToken token = default)
         {
             var tcs = new TaskCompletionSource<object>();
 
@@ -148,7 +168,7 @@ namespace System.Reactive.Concurrency
             }
         }
 
-        public static async Task<TResult> ExecuteAsync<TResult>(this IAsyncScheduler scheduler, Func<CancellationToken, Task<TResult>> action, CancellationToken token = default(CancellationToken))
+        public static async ValueTask<TResult> ExecuteAsync<TResult>(this IAsyncScheduler scheduler, Func<CancellationToken, ValueTask<TResult>> action, CancellationToken token = default)
         {
             var tcs = new TaskCompletionSource<TResult>();
 
@@ -240,7 +260,7 @@ namespace System.Reactive.Concurrency
                         _done = true;
                     }
 
-                    return Task.CompletedTask;
+                    return default;
                 }, _token);
             }
         }

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Concurrency/System/Reactive/Concurrency/AsyncSchedulerBase.cs

@@ -70,11 +70,11 @@ namespace System.Reactive.Concurrency
 
             public CancellationToken Token => _cts.Token;
 
-            public Task DisposeAsync()
+            public ValueTask DisposeAsync()
             {
                 _cts.Cancel();
 
-                return Task.CompletedTask;
+                return default;
             }
         }
     }

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Concurrency/System/Threading/Tasks/TaskAwaitable.cs

@@ -63,7 +63,7 @@ namespace System.Threading.Tasks
                         {
                             Invoke();
 
-                            return Task.CompletedTask;
+                            return default;
                         }, _token);
                     }
                     else
@@ -136,7 +136,7 @@ namespace System.Threading.Tasks
                         {
                             Invoke();
 
-                            return Task.CompletedTask;
+                            return default;
                         }, _token);
                     }
                     else

+ 155 - 0
AsyncRx.NET/System.Reactive.Async.Concurrency/System/Threading/Tasks/ValueTaskAwaitable.cs

@@ -0,0 +1,155 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT License.
+// See the LICENSE file in the project root for more information. 
+
+using System.Reactive.Concurrency;
+using System.Runtime.CompilerServices;
+
+namespace System.Threading.Tasks
+{
+    public sealed class ValueTaskAwaitable : IAwaitable, IAwaiter
+    {
+        private readonly ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter _task;
+        private readonly IAsyncScheduler _scheduler;
+        private readonly CancellationToken _token;
+
+        public ValueTaskAwaitable(ValueTask task, bool continueOnCapturedContext, IAsyncScheduler scheduler, CancellationToken token)
+        {
+            if (task == null)
+                throw new ArgumentNullException(nameof(task));
+
+            _task = task.ConfigureAwait(continueOnCapturedContext).GetAwaiter();
+            _scheduler = scheduler;
+            _token = token;
+        }
+
+        public bool IsCompleted => _task.IsCompleted;
+
+        public IAwaiter GetAwaiter() => this;
+
+        public void GetResult()
+        {
+            _token.ThrowIfCancellationRequested();
+
+            _task.GetResult();
+        }
+
+        public void OnCompleted(Action continuation)
+        {
+            var cancel = default(IDisposable);
+
+            if (_token.CanBeCanceled)
+            {
+                cancel = _token.Register(() =>
+                {
+                    Interlocked.Exchange(ref continuation, null)?.Invoke();
+                });
+            }
+
+            try
+            {
+                _task.OnCompleted(() =>
+                {
+                    void Invoke()
+                    {
+                        cancel?.Dispose();
+
+                        Interlocked.Exchange(ref continuation, null)?.Invoke();
+                    }
+
+                    if (_scheduler != null)
+                    {
+                        var t = _scheduler.ExecuteAsync(ct =>
+                        {
+                            Invoke();
+
+                            return default;
+                        }, _token);
+                    }
+                    else
+                    {
+                        Invoke();
+                    }
+                });
+            }
+            catch
+            {
+                cancel?.Dispose();
+                throw;
+            }
+        }
+    }
+
+    public sealed class ValueTaskAwaitable<T> : IAwaitable<T>, IAwaiter<T>
+    {
+        private readonly ConfiguredValueTaskAwaitable<T>.ConfiguredValueTaskAwaiter _task;
+        private readonly IAsyncScheduler _scheduler;
+        private readonly CancellationToken _token;
+
+        public ValueTaskAwaitable(ValueTask<T> task, bool continueOnCapturedContext, IAsyncScheduler scheduler, CancellationToken token)
+        {
+            if (task == null)
+                throw new ArgumentNullException(nameof(task));
+
+            _task = task.ConfigureAwait(continueOnCapturedContext).GetAwaiter();
+            _scheduler = scheduler;
+            _token = token;
+        }
+
+        public bool IsCompleted => _task.IsCompleted;
+
+        public IAwaiter<T> GetAwaiter() => this;
+
+        public T GetResult()
+        {
+            _token.ThrowIfCancellationRequested();
+
+            return _task.GetResult();
+        }
+
+        public void OnCompleted(Action continuation)
+        {
+            var cancel = default(IDisposable);
+
+            if (_token.CanBeCanceled)
+            {
+                cancel = _token.Register(() =>
+                {
+                    Interlocked.Exchange(ref continuation, null)?.Invoke();
+                });
+            }
+
+            try
+            {
+                _task.OnCompleted(() =>
+                {
+                    void Invoke()
+                    {
+                        cancel?.Dispose();
+
+                        Interlocked.Exchange(ref continuation, null)?.Invoke();
+                    }
+
+                    if (_scheduler != null)
+                    {
+                        var t = _scheduler.ExecuteAsync(ct =>
+                        {
+                            Invoke();
+
+                            return default;
+                        }, _token);
+                    }
+                    else
+                    {
+                        Invoke();
+                    }
+                });
+            }
+            catch
+            {
+                cancel?.Dispose();
+                throw;
+            }
+        }
+    }
+}

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Core/System.Reactive.Async.Core.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Core/System/Reactive/AsyncObservableBase.cs

@@ -60,7 +60,7 @@ namespace System.Reactive
                 }
             }
 
-            public async Task DisposeAsync()
+            public async ValueTask DisposeAsync()
             {
                 var task = default(Task);
                 var subscription = default(IAsyncDisposable);

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Disposables/System.Reactive.Async.Disposables.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

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

@@ -11,7 +11,7 @@ namespace System.Reactive.Disposables
     {
         public static IAsyncDisposable Nop { get; } = new NopAsyncDisposable();
 
-        public static IAsyncDisposable Create(Func<Task> dispose)
+        public static IAsyncDisposable Create(Func<ValueTask> dispose)
         {
             if (dispose == null)
                 throw new ArgumentNullException(nameof(dispose));
@@ -21,19 +21,19 @@ namespace System.Reactive.Disposables
 
         private sealed class AnonymousAsyncDisposable : IAsyncDisposable
         {
-            private Func<Task> _dispose;
+            private Func<ValueTask> _dispose;
 
-            public AnonymousAsyncDisposable(Func<Task> dispose)
+            public AnonymousAsyncDisposable(Func<ValueTask> dispose)
             {
                 _dispose = dispose;
             }
 
-            public Task DisposeAsync() => Interlocked.Exchange(ref _dispose, null)?.Invoke() ?? Task.CompletedTask;
+            public ValueTask DisposeAsync() => Interlocked.Exchange(ref _dispose, null)?.Invoke() ?? default;
         }
 
         private sealed class NopAsyncDisposable : IAsyncDisposable
         {
-            public Task DisposeAsync() => Task.CompletedTask;
+            public ValueTask DisposeAsync() => default;
         }
     }
 }

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/CancellationAsyncDisposable.cs

@@ -26,11 +26,11 @@ namespace System.Reactive.Disposables
 
         public CancellationToken Token => _cts.Token;
 
-        public Task DisposeAsync()
+        public ValueTask DisposeAsync()
         {
             _cts.Cancel();
 
-            return Task.CompletedTask;
+            return default;
         }
     }
 }

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/CompositeAsyncDisposable.cs

@@ -84,7 +84,7 @@ namespace System.Reactive.Disposables
             return shouldDispose;
         }
 
-        public async Task DisposeAsync()
+        public async ValueTask DisposeAsync()
         {
             var disposables = default(IAsyncDisposable[]);
 
@@ -101,7 +101,7 @@ namespace System.Reactive.Disposables
 
             if (disposables != null)
             {
-                var tasks = disposables.Select(disposable => disposable.DisposeAsync());
+                var tasks = disposables.Select(disposable => disposable.DisposeAsync().AsTask());
 
                 await Task.WhenAll(tasks);
             }

+ 3 - 3
AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/RefCountAsyncDisposable.cs

@@ -40,7 +40,7 @@ namespace System.Reactive.Disposables
             }
         }
 
-        public async Task DisposeAsync()
+        public async ValueTask DisposeAsync()
         {
             var disposable = default(IAsyncDisposable);
 
@@ -64,7 +64,7 @@ namespace System.Reactive.Disposables
             }
         }
 
-        private async Task ReleaseAsync()
+        private async ValueTask ReleaseAsync()
         {
             var disposable = default(IAsyncDisposable);
 
@@ -97,7 +97,7 @@ namespace System.Reactive.Disposables
                 _parent = parent;
             }
 
-            public Task DisposeAsync() => Interlocked.Exchange(ref _parent, null)?.ReleaseAsync() ?? Task.CompletedTask;
+            public ValueTask DisposeAsync() => Interlocked.Exchange(ref _parent, null)?.ReleaseAsync() ?? default;
         }
     }
 }

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/SerialAsyncDisposable.cs

@@ -46,7 +46,7 @@ namespace System.Reactive.Disposables
             }
         }
 
-        public async Task DisposeAsync()
+        public async ValueTask DisposeAsync()
         {
             var old = default(IAsyncDisposable);
 

+ 3 - 3
AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/SingleAssignmentAsyncDisposable.cs

@@ -9,7 +9,7 @@ namespace System.Reactive.Disposables
 {
     public sealed class SingleAssignmentAsyncDisposable : IAsyncDisposable
     {
-        private static readonly IAsyncDisposable Disposed = AsyncDisposable.Create(() => Task.CompletedTask);
+        private static readonly IAsyncDisposable Disposed = AsyncDisposable.Create(() => default);
 
         private IAsyncDisposable _disposable;
 
@@ -29,9 +29,9 @@ namespace System.Reactive.Disposables
             await disposable.DisposeAsync().ConfigureAwait(false);
         }
 
-        public Task DisposeAsync()
+        public ValueTask DisposeAsync()
         {
-            return Interlocked.Exchange(ref _disposable, Disposed)?.DisposeAsync() ?? Task.CompletedTask;
+            return Interlocked.Exchange(ref _disposable, Disposed)?.DisposeAsync() ?? default;
         }
     }
 }

+ 4 - 4
AsyncRx.NET/System.Reactive.Async.Disposables/System/Reactive/Disposables/StableCompositeAsyncDisposable.cs

@@ -36,7 +36,7 @@ namespace System.Reactive.Disposables
             return new NAry(disposables);
         }
 
-        public abstract Task DisposeAsync();
+        public abstract ValueTask DisposeAsync();
 
         private sealed class Binary : StableCompositeAsyncDisposable
         {
@@ -49,7 +49,7 @@ namespace System.Reactive.Disposables
                 _disposable2 = disposable2;
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 var d1 = Interlocked.Exchange(ref _disposable1, null);
                 if (d1 != null)
@@ -79,7 +79,7 @@ namespace System.Reactive.Disposables
                 _disposables = new List<IAsyncDisposable>(disposables);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 var old = Interlocked.Exchange(ref _disposables, null);
                 if (old != null)
@@ -95,4 +95,4 @@ namespace System.Reactive.Disposables
             }
         }
     }
-}
+}

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Interfaces/System.Reactive.Async.Interfaces.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
 </Project>

+ 0 - 13
AsyncRx.NET/System.Reactive.Async.Interfaces/System/IAsyncDisposable.cs

@@ -1,13 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT License.
-// See the LICENSE file in the project root for more information. 
-
-using System.Threading.Tasks;
-
-namespace System
-{
-    public interface IAsyncDisposable
-    {
-        Task DisposeAsync();
-    }
-}

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System.Reactive.Async.Linq.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Joins/AsyncJoinObserver.cs

@@ -46,7 +46,7 @@ namespace System.Reactive.Joins
             }
         }
 
-        public async Task DisposeAsync()
+        public async ValueTask DisposeAsync()
         {
             if (!_isDisposed)
             {

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/Amb.cs

@@ -212,7 +212,7 @@ namespace System.Reactive.Linq
                 {
                     if (i != index)
                     {
-                        dispose.Add(subscriptions[i].DisposeAsync());
+                        dispose.Add(subscriptions[i].DisposeAsync().AsTask());
                     }
                 }
 

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/Catch.cs

@@ -216,7 +216,7 @@ namespace System.Reactive.Linq
             var disposeEnumerator = AsyncDisposable.Create(() =>
             {
                 handlers.Dispose();
-                return Task.CompletedTask;
+                return default;
             });
 
             var subscription = StableCompositeAsyncDisposable.Create(innerSubscription, disposeEnumerator);

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/Concat.cs

@@ -126,7 +126,7 @@ namespace System.Reactive.Linq
             var disposeEnumerator = AsyncDisposable.Create(() =>
             {
                 handlers.Dispose();
-                return Task.CompletedTask;
+                return default;
             });
 
             var subscription = StableCompositeAsyncDisposable.Create(innerSubscription, disposeEnumerator);

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/For.cs

@@ -83,7 +83,7 @@ namespace System.Reactive.Linq
                 var disposeEnumerator = AsyncDisposable.Create(() =>
                 {
                     enumerator.Dispose();
-                    return Task.CompletedTask;
+                    return default;
                 });
 
                 return StableCompositeAsyncDisposable.Create(disposeEnumerator, subscription);

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/ForEachAsync.cs

@@ -62,7 +62,7 @@ namespace System.Reactive.Linq
             {
                 tcs.TrySetCanceled(token);
 
-                subscription.DisposeAsync().ContinueWith(t =>
+                subscription.DisposeAsync().AsTask().ContinueWith(t =>
                 {
                     if (t.Exception != null)
                     {

+ 15 - 15
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEvent.Generated.cs

@@ -77,7 +77,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -151,7 +151,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -225,7 +225,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -299,7 +299,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -373,7 +373,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -447,7 +447,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -521,7 +521,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -595,7 +595,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -669,7 +669,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -743,7 +743,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -817,7 +817,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -891,7 +891,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -965,7 +965,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -1039,7 +1039,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler
@@ -1113,7 +1113,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEvent.Generated.tt

@@ -90,7 +90,7 @@ for (var i = 2; i <= 16; i++)
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEvent.cs

@@ -122,7 +122,7 @@ namespace System.Reactive.Linq
                         {
                             removeHandler(converted);
 
-                            return Task.CompletedTask;
+                            return default;
                         }));
                     }),
                     scheduler

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/FromEventPattern.cs

@@ -208,7 +208,7 @@ namespace System.Reactive.Linq
                             ExceptionDispatchInfo.Capture(tie.InnerException).Throw();
                         }
 
-                        return Task.CompletedTask;
+                        return default;
                     });
 
                     return Task.FromResult(dispose);
@@ -245,7 +245,7 @@ namespace System.Reactive.Linq
                             ExceptionDispatchInfo.Capture(tie.InnerException).Throw();
                         }
 
-                        return Task.CompletedTask;
+                        return default;
                     });
 
                     return Task.FromResult(dispose);

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/OnErrorResumeNext.cs

@@ -133,7 +133,7 @@ namespace System.Reactive.Linq
             var disposeEnumerator = AsyncDisposable.Create(() =>
             {
                 handlers.Dispose();
-                return Task.CompletedTask;
+                return default;
             });
 
             var subscription = StableCompositeAsyncDisposable.Create(innerSubscription, disposeEnumerator);

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Linq/Operators/ToAsyncObservable.cs

@@ -50,7 +50,7 @@ namespace System.Reactive.Linq
                     var disposeTask = AsyncDisposable.Create(() => disposeScheduler.ExecuteAsync(_ =>
                     {
                         disposable.Dispose();
-                        return Task.CompletedTask;
+                        return default;
                     }));
 
                     await d.AddAsync(disposeTask).RendezVous(subscribeScheduler);

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Linq/System/Reactive/Subjects/ConnectableAsyncObservable.cs

@@ -47,7 +47,7 @@ namespace System.Reactive.Subjects
                 this.subscription = subscription;
             }
 
-            public async Task DisposeAsync()
+            public async ValueTask DisposeAsync()
             {
                 using (await parent.gate.LockAsync().ConfigureAwait(false))
                 {

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Subjects/System.Reactive.Async.Subjects.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/FastImmediateAsyncObserver.cs

@@ -17,7 +17,7 @@ namespace System.Reactive
         {
         }
 
-        public override Task DisposeAsync() => _disposable.DisposeAsync();
+        public override ValueTask DisposeAsync() => _disposable.DisposeAsync();
 
         protected override IAwaitable RendezVous(Task task) => new TaskAwaitable(task, false, null, CancellationToken.None);
 

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/ScheduledAsyncObserver.cs

@@ -21,7 +21,7 @@ namespace System.Reactive
             _scheduler = scheduler;
         }
 
-        public override Task DisposeAsync() => _disposable.DisposeAsync();
+        public override ValueTask DisposeAsync() => _disposable.DisposeAsync();
 
         protected override IAwaitable RendezVous(Task task) => new TaskAwaitable(task, false, _scheduler, CancellationToken.None);
 

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/ScheduledAsyncObserverBase.cs

@@ -152,6 +152,6 @@ namespace System.Reactive
 
         protected abstract IAwaitable<R> RendezVous<R>(Task<R> task);
 
-        public abstract Task DisposeAsync();
+        public abstract ValueTask DisposeAsync();
     }
 }

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/AsyncAsyncSubject.cs

@@ -146,7 +146,7 @@ namespace System.Reactive.Subjects
                     }
                 }
 
-                return Task.CompletedTask;
+                return default;
             });
         }
 

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/BehaviorAsyncSubject.cs

@@ -164,7 +164,7 @@ namespace System.Reactive.Subjects
                     }
                 }
 
-                return Task.CompletedTask;
+                return default;
             });
         }
     }

+ 2 - 2
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/ReplayAsyncSubject.cs

@@ -291,7 +291,7 @@ namespace System.Reactive.Subjects
 
             protected abstract void Trim();
 
-            private async Task UnsubscribeAsync(IScheduledAsyncObserver<T> observer)
+            private async ValueTask UnsubscribeAsync(IScheduledAsyncObserver<T> observer)
             {
                 using (await _lock.LockAsync().ConfigureAwait(false))
                 {
@@ -310,7 +310,7 @@ namespace System.Reactive.Subjects
                     _scheduled = scheduled;
                 }
 
-                public Task DisposeAsync() => _parent.UnsubscribeAsync(_scheduled);
+                public ValueTask DisposeAsync() => _parent.UnsubscribeAsync(_scheduled);
             }
         }
 

+ 1 - 1
AsyncRx.NET/System.Reactive.Async.Subjects/System/Reactive/Subjects/SimpleAsyncSubject.cs

@@ -124,7 +124,7 @@ namespace System.Reactive.Subjects
                         }
                     }
 
-                    return Task.CompletedTask;
+                    return default;
                 });
             }
         }

+ 2 - 2
AsyncRx.NET/System.Reactive.Async/System.Reactive.Async.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
AsyncRx.NET/System.Reactive.Bcl/System.Reactive.Bcl.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
AsyncRx.NET/System.Reactive.Bcl/System/Threading/AsyncQueueLock.cs

@@ -67,7 +67,7 @@ namespace System.Threading
             }
         }
 
-        public async Task DisposeAsync()
+        public async ValueTask DisposeAsync()
         {
             var queue = _queue;
 

+ 2 - 2
AsyncRx.NET/System.Reactive.Shared/System.Reactive.Shared.csproj

@@ -1,7 +1,7 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>netstandard2.0</TargetFramework>
+    <TargetFramework>netstandard2.1</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>