Browse Source

Update to use latest interface spec

Oren Novotny 7 years ago
parent
commit
812308825f
58 changed files with 246 additions and 240 deletions
  1. 4 4
      Ix.NET/Source/System.Interactive.Async.Tests/AsyncTests.Bugs.cs
  2. 3 3
      Ix.NET/Source/System.Interactive.Async/AsyncIterator.cs
  3. 9 9
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Amb.cs
  4. 2 2
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Buffer.cs
  5. 6 6
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Catch.cs
  6. 4 4
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Concat.cs
  7. 4 4
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Distinct.cs
  8. 6 6
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/DistinctUntilChanged.cs
  9. 4 4
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Do.cs
  10. 4 4
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Expand.cs
  11. 4 4
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Finally.cs
  12. 2 2
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Generate.cs
  13. 2 2
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/IgnoreElements.cs
  14. 7 7
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Merge.cs
  15. 2 2
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/OnErrorResumeNext.cs
  16. 3 3
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Repeat.cs
  17. 8 8
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Scan.cs
  18. 2 2
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Throw.cs
  19. 3 3
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Timeout.cs
  20. 4 4
      Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Using.cs
  21. 4 4
      Ix.NET/Source/System.Interactive.Async/TaskExt.cs
  22. 4 0
      Ix.NET/Source/System.Linq.Async/System.Linq.Async.csproj
  23. 1 1
      Ix.NET/Source/System.Linq.Async/System/Collections/Generic/IAsyncEnumerator.cs
  24. 1 1
      Ix.NET/Source/System.Linq.Async/System/IAsyncDisposable.cs
  25. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerable.cs
  26. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerablePartition.cs
  27. 8 8
      Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerator.cs
  28. 3 3
      Ix.NET/Source/System.Linq.Async/System/Linq/AsyncIterator.cs
  29. 1 1
      Ix.NET/Source/System.Linq.Async/System/Linq/AsyncListPartition.cs
  30. 4 4
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/AppendPrepend.cs
  31. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Concat.cs
  32. 7 7
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Create.cs
  33. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/DefaultIfEmpty.cs
  34. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Distinct.cs
  35. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Empty.cs
  36. 3 3
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Except.cs
  37. 12 12
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/GroupBy.cs
  38. 4 4
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/GroupJoin.cs
  39. 3 3
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Intersect.cs
  40. 4 4
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Join.cs
  41. 4 4
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/OrderedAsyncEnumerable.cs
  42. 1 1
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Range.cs
  43. 1 1
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Repeat.cs
  44. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Reverse.cs
  45. 12 12
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Select.cs
  46. 16 16
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SelectMany.cs
  47. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SkipLast.cs
  48. 8 8
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SkipWhile.cs
  49. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/TakeLast.cs
  50. 8 8
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/TakeWhile.cs
  51. 9 9
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToAsyncEnumerable.cs
  52. 2 1
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToEnumerable.cs
  53. 1 1
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToObservable.cs
  54. 2 2
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Union.cs
  55. 10 10
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Where.cs
  56. 7 6
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Zip.cs
  57. 2 2
      Ix.NET/Source/System.Linq.Async/System/Threading/Tasks/AsyncEnumerableExtensions.cs
  58. 3 3
      Ix.NET/Source/System.Linq.Async/System/Threading/Tasks/TaskExt.cs

+ 4 - 4
Ix.NET/Source/System.Interactive.Async.Tests/AsyncTests.Bugs.cs

@@ -138,15 +138,15 @@ namespace Tests
                     _disposeCounter = disposeCounter;
                 }
 
-                public Task DisposeAsync()
+                public ValueTask DisposeAsync()
                 {
                     _disposeCounter.DisposeCount++;
-                    return Task.FromResult(true);
+                    return new ValueTask(Task.FromResult(true));
                 }
 
-                public Task<bool> MoveNextAsync()
+                public ValueTask<bool> MoveNextAsync()
                 {
-                    return Task.Factory.StartNew(() => false);
+                    return new ValueTask<bool>(Task.Factory.StartNew(() => false));
                 }
 
                 public object Current { get; private set; }

+ 3 - 3
Ix.NET/Source/System.Interactive.Async/AsyncIterator.cs

@@ -43,7 +43,7 @@ namespace System.Linq
             return enumerator;
         }
 
-        public virtual Task DisposeAsync()
+        public virtual ValueTask DisposeAsync()
         {
             current = default(TSource);
             state = AsyncIteratorState.Disposed;
@@ -62,7 +62,7 @@ namespace System.Linq
             }
         }
 
-        public async Task<bool> MoveNextAsync()
+        public async ValueTask<bool> MoveNextAsync()
         {
             // Note: MoveNext *must* be implemented as an async method to ensure
             // that any exceptions thrown from the MoveNextCore call are handled 
@@ -91,7 +91,7 @@ namespace System.Linq
 
         public abstract AsyncIterator<TSource> Clone();
 
-        protected abstract Task<bool> MoveNextCore();
+        protected abstract ValueTask<bool> MoveNextCore();
 
         protected virtual void OnGetEnumerator()
         {

+ 9 - 9
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Amb.cs

@@ -57,7 +57,7 @@ namespace System.Linq
                 return new AmbAsyncIterator<TSource>(first, second);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -68,7 +68,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -76,8 +76,8 @@ namespace System.Linq
                         var firstEnumerator = first.GetAsyncEnumerator();
                         var secondEnumerator = second.GetAsyncEnumerator();
 
-                        var firstMoveNext = firstEnumerator.MoveNextAsync();
-                        var secondMoveNext = secondEnumerator.MoveNextAsync();
+                        var firstMoveNext = firstEnumerator.MoveNextAsync().AsTask();
+                        var secondMoveNext = secondEnumerator.MoveNextAsync().AsTask();
 
                         var winner = await Task.WhenAny(firstMoveNext, secondMoveNext).ConfigureAwait(false);
 
@@ -152,7 +152,7 @@ namespace System.Linq
                 return new AmbAsyncIteratorN<TSource>(sources);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -163,7 +163,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -171,7 +171,7 @@ namespace System.Linq
                         var n = sources.Length;
 
                         var enumerators = new IAsyncEnumerator<TSource>[n];
-                        var moveNexts = new Task<bool>[n];
+                        var moveNexts = new ValueTask<bool>[n];
 
                         for (var i = 0; i < n; i++)
                         {
@@ -181,7 +181,7 @@ namespace System.Linq
                             moveNexts[i] = enumerator.MoveNextAsync();
                         }
 
-                        var winner = await Task.WhenAny(moveNexts).ConfigureAwait(false);
+                        var winner = await Task.WhenAny(moveNexts.Select(t => t.AsTask())).ConfigureAwait(false);
 
                         //
                         // REVIEW: An alternative option is to call DisposeAsync on the other and await it, but this has two drawbacks:
@@ -200,7 +200,7 @@ namespace System.Linq
                         {
                             if (i != winnerIndex)
                             {
-                                var ignored = moveNexts[i].ContinueWith(_ =>
+                                var ignored = moveNexts[i].AsTask().ContinueWith(_ =>
                                 {
                                     enumerators[i].DisposeAsync();
                                 });

+ 2 - 2
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Buffer.cs

@@ -70,7 +70,7 @@ namespace System.Linq
                 return new BufferAsyncIterator<TSource>(source, count, skip);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -83,7 +83,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 6 - 6
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Catch.cs

@@ -86,7 +86,7 @@ namespace System.Linq
                 return new CatchAsyncIterator<TSource, TException>(source, handler);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -97,7 +97,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -179,7 +179,7 @@ namespace System.Linq
                 return new CatchAsyncIteratorWithTask<TSource, TException>(source, handler);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -190,7 +190,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -271,7 +271,7 @@ namespace System.Linq
                 return new CatchAsyncIterator<TSource>(sources);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourcesEnumerator != null)
                 {
@@ -290,7 +290,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Concat.cs

@@ -55,7 +55,7 @@ namespace System.Linq
                 return new ConcatEnumerableAsyncIterator<TSource>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (outerEnumerator != null)
                 {
@@ -80,7 +80,7 @@ namespace System.Linq
             private const int State_OuterNext = 1;
             private const int State_While = 4;
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
 
                 switch (state)
@@ -145,7 +145,7 @@ namespace System.Linq
                 return new ConcatAsyncEnumerableAsyncIterator<TSource>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (outerEnumerator != null)
                 {
@@ -170,7 +170,7 @@ namespace System.Linq
             private const int State_OuterNext = 1;
             private const int State_While = 4;
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
 
                 switch (state)

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Distinct.cs

@@ -133,7 +133,7 @@ namespace System.Linq
                 return new DistinctAsyncIterator<TSource, TKey>(source, keySelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -145,7 +145,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -279,7 +279,7 @@ namespace System.Linq
                 return new DistinctAsyncIteratorWithTask<TSource, TKey>(source, keySelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -291,7 +291,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 6 - 6
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/DistinctUntilChanged.cs

@@ -110,7 +110,7 @@ namespace System.Linq
                 return new DistinctUntilChangedAsyncIterator<TSource>(source, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -122,7 +122,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -181,7 +181,7 @@ namespace System.Linq
                 return new DistinctUntilChangedAsyncIterator<TSource, TKey>(source, keySelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -193,7 +193,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -252,7 +252,7 @@ namespace System.Linq
                 return new DistinctUntilChangedAsyncIteratorWithTask<TSource, TKey>(source, keySelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -264,7 +264,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Do.cs

@@ -151,7 +151,7 @@ namespace System.Linq
                 return new DoAsyncIterator<TSource>(source, onNext, onError, onCompleted);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -162,7 +162,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -227,7 +227,7 @@ namespace System.Linq
                 return new DoAsyncIteratorWithTask<TSource>(source, onNext, onError, onCompleted);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -238,7 +238,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Expand.cs

@@ -53,7 +53,7 @@ namespace System.Linq
                 return new ExpandAsyncIterator<TSource>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -66,7 +66,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -143,7 +143,7 @@ namespace System.Linq
                 return new ExpandAsyncIteratorWithTask<TSource>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -156,7 +156,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Finally.cs

@@ -51,7 +51,7 @@ namespace System.Linq
                 return new FinallyAsyncIterator<TSource>(source, finallyAction);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -64,7 +64,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -109,7 +109,7 @@ namespace System.Linq
                 return new FinallyAsyncIteratorWithTask<TSource>(source, finallyAction);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -122,7 +122,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Generate.cs

@@ -58,14 +58,14 @@ namespace System.Linq
                 return new GenerateAsyncIterator<TState, TResult>(initialState, condition, iterate, resultSelector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 currentState = default;
 
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/IgnoreElements.cs

@@ -37,7 +37,7 @@ namespace System.Linq
                 return new IgnoreElementsAsyncIterator<TSource>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -48,7 +48,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 7 - 7
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Merge.cs

@@ -39,7 +39,7 @@ namespace System.Linq
             private readonly IAsyncEnumerable<TSource>[] sources;
 
             private IAsyncEnumerator<TSource>[] enumerators;
-            private Task<bool>[] moveNexts;
+            private ValueTask<bool>[] moveNexts;
             private int active;
 
             public MergeAsyncIterator(IAsyncEnumerable<TSource>[] sources)
@@ -54,13 +54,13 @@ namespace System.Linq
                 return new MergeAsyncIterator<TSource>(sources);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerators != null)
                 {
                     var n = enumerators.Length;
 
-                    var disposes = new Task[n];
+                    var disposes = new ValueTask[n];
 
                     for (var i = 0; i < n; i++)
                     {
@@ -68,14 +68,14 @@ namespace System.Linq
                         disposes[i] = dispose;
                     }
 
-                    await Task.WhenAll(disposes).ConfigureAwait(false);
+                    await Task.WhenAll(disposes.Select(t => t.AsTask())).ConfigureAwait(false);
                     enumerators = null;
                 }
 
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -83,7 +83,7 @@ namespace System.Linq
                         var n = sources.Length;
 
                         enumerators = new IAsyncEnumerator<TSource>[n];
-                        moveNexts = new Task<bool>[n];
+                        moveNexts = new ValueTask<bool>[n];
                         active = n;
 
                         for (var i = 0; i < n; i++)
@@ -105,7 +105,7 @@ namespace System.Linq
                             //         want to consider a "prefer fairness" option.
                             //
 
-                            var moveNext = await Task.WhenAny(moveNexts).ConfigureAwait(false);
+                            var moveNext = await Task.WhenAny(moveNexts.Select(t => t.AsTask())).ConfigureAwait(false);
 
                             var index = Array.IndexOf(moveNexts, moveNext);
 

+ 2 - 2
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/OnErrorResumeNext.cs

@@ -60,7 +60,7 @@ namespace System.Linq
                 return new OnErrorResumeNextAsyncIterator<TSource>(sources);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourcesEnumerator != null)
                 {
@@ -77,7 +77,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 3 - 3
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Repeat.cs

@@ -47,7 +47,7 @@ namespace System.Linq
                 return new RepeatElementAsyncIterator<TResult>(element);
             }
 
-            protected override Task<bool> MoveNextCore()
+            protected override ValueTask<bool> MoveNextCore()
             {
                 current = element;
                 return TaskExt.True;
@@ -78,7 +78,7 @@ namespace System.Linq
                 return new RepeatSequenceAsyncIterator<TSource>(source, count);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -89,7 +89,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 8 - 8
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Scan.cs

@@ -74,7 +74,7 @@ namespace System.Linq
                 return new ScanAsyncEnumerable<TSource>(source, accumulator);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -86,7 +86,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -148,7 +148,7 @@ namespace System.Linq
                 return new ScanAsyncEnumerable<TSource, TAccumulate>(source, seed, accumulator);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -160,7 +160,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -212,7 +212,7 @@ namespace System.Linq
                 return new ScanAsyncEnumerableWithTask<TSource>(source, accumulator);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -224,7 +224,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -286,7 +286,7 @@ namespace System.Linq
                 return new ScanAsyncEnumerableWithTask<TSource, TAccumulate>(source, seed, accumulator);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -298,7 +298,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Throw.cs

@@ -17,9 +17,9 @@ namespace System.Linq
 #if NO_TASK_FROMEXCEPTION
             var tcs = new TaskCompletionSource<bool>();
             tcs.TrySetException(exception);
-            var moveNextThrows = tcs.Task;
+            var moveNextThrows = new ValueTask<bool>(tcs.Task);
 #else
-            var moveNextThrows = Task.FromException<bool>(exception);
+            var moveNextThrows = new ValueTask<bool>(Task.FromException<bool>(exception));
 #endif
 
             return AsyncEnumerable.CreateEnumerable(

+ 3 - 3
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Timeout.cs

@@ -43,7 +43,7 @@ namespace System.Linq
                 return new TimeoutAsyncIterator<TSource>(source, timeout);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -54,7 +54,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -73,7 +73,7 @@ namespace System.Linq
                             {
                                 var delay = Task.Delay(timeout, delayCts.Token);
 
-                                var winner = await Task.WhenAny(moveNext, delay).ConfigureAwait(false);
+                                var winner = await Task.WhenAny(moveNext.AsTask(), delay).ConfigureAwait(false);
 
                                 if (winner == delay)
                                 {

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Using.cs

@@ -53,7 +53,7 @@ namespace System.Linq
                 return new UsingAsyncIterator<TSource, TResource>(resourceFactory, enumerableFactory);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -70,7 +70,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -125,7 +125,7 @@ namespace System.Linq
                 return new UsingAsyncIteratorWithTask<TSource, TResource>(resourceFactory, enumerableFactory);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -142,7 +142,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Interactive.Async/TaskExt.cs

@@ -6,9 +6,9 @@ namespace System.Threading.Tasks
 {
     internal static class TaskExt
     {
-        public static readonly Task<bool> True = Task.FromResult(true);
-        public static readonly Task<bool> False = Task.FromResult(false);
-        public static readonly Task<bool> Never = new TaskCompletionSource<bool>().Task;
-        public static readonly Task CompletedTask = True;
+        public static readonly ValueTask<bool> True = new ValueTask<bool>(true);
+        public static readonly ValueTask<bool> False = new ValueTask<bool>(false);
+        public static readonly ValueTask CompletedTask = new ValueTask(Task.FromResult(true));
+        public static readonly ValueTask<bool> Never = new ValueTask<bool>(new TaskCompletionSource<bool>().Task);
     }
 }

+ 4 - 0
Ix.NET/Source/System.Linq.Async/System.Linq.Async.csproj

@@ -4,6 +4,10 @@
     <TargetFrameworks>net45;net46;netstandard1.4;netstandard2.0</TargetFrameworks>
   </PropertyGroup>
 
+  <ItemGroup>
+    <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.1" />
+  </ItemGroup>
+
   <ItemGroup>
     <Compile Update="System\Linq\Operators\Average.Generated.cs">
       <DependentUpon>Average.Generated.tt</DependentUpon>

+ 1 - 1
Ix.NET/Source/System.Linq.Async/System/Collections/Generic/IAsyncEnumerator.cs

@@ -27,6 +27,6 @@ namespace System.Collections.Generic
         /// Task containing the result of the operation: true if the enumerator was successfully advanced
         /// to the next element; false if the enumerator has passed the end of the sequence.
         /// </returns>
-        Task<bool> MoveNextAsync();
+        ValueTask<bool> MoveNextAsync();
     }
 }

+ 1 - 1
Ix.NET/Source/System.Linq.Async/System/IAsyncDisposable.cs

@@ -11,6 +11,6 @@ namespace System
 {
     public interface IAsyncDisposable
     {
-        Task DisposeAsync();
+        ValueTask DisposeAsync();
     }
 }

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerable.cs

@@ -25,9 +25,9 @@ namespace System.Linq
 #if NO_TASK_FROMEXCEPTION
             var tcs = new TaskCompletionSource<bool>();
             tcs.TrySetException(exception);
-            var moveNextThrows = tcs.Task;
+            var moveNextThrows = new ValueTask<bool>(tcs.Task);
 #else
-            var moveNextThrows = Task.FromException<bool>(exception);
+            var moveNextThrows = new ValueTask<bool>(Task.FromException<bool>(exception));
 #endif
 
             return CreateEnumerable(

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerablePartition.cs

@@ -51,7 +51,7 @@ namespace System.Linq
             return new AsyncEnumerablePartition<TSource>(_source, _minIndexInclusive, _maxIndexInclusive);
         }
 
-        public override async Task DisposeAsync()
+        public override async ValueTask DisposeAsync()
         {
             if (_enumerator != null)
             {
@@ -102,7 +102,7 @@ namespace System.Linq
         private bool hasSkipped;
         private int taken;
 
-        protected override async Task<bool> MoveNextCore()
+        protected override async ValueTask<bool> MoveNextCore()
         {
             switch (state)
             {

+ 8 - 8
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerator.cs

@@ -22,7 +22,7 @@ namespace System.Collections.Generic
         /// <param name="current">The delegate implementing the <see cref="IAsyncEnumerator{T}.Current"/> property getter.</param>
         /// <param name="dispose">The delegate implementing the <see cref="IAsyncDisposable.DisposeAsync"/> method.</param>
         /// <returns>A new enumerator instance.</returns>
-        public static IAsyncEnumerator<T> Create<T>(Func<Task<bool>> moveNext, Func<T> current, Func<Task> dispose)
+        public static IAsyncEnumerator<T> Create<T>(Func<ValueTask<bool>> moveNext, Func<T> current, Func<ValueTask> dispose)
         {
             if (moveNext == null)
                 throw new ArgumentNullException(nameof(moveNext));
@@ -42,7 +42,7 @@ namespace System.Collections.Generic
         /// Task containing the result of the operation: true if the enumerator was successfully advanced
         /// to the next element; false if the enumerator has passed the end of the sequence.
         /// </returns>
-        public static Task<bool> MoveNextAsync<T>(this IAsyncEnumerator<T> source, CancellationToken cancellationToken)
+        public static ValueTask<bool> MoveNextAsync<T>(this IAsyncEnumerator<T> source, CancellationToken cancellationToken)
         {
             if (source == null)
                 throw new ArgumentNullException(nameof(source));
@@ -90,7 +90,7 @@ namespace System.Collections.Generic
             return AsyncEnumerable.CreateEnumerable<T>(() => source);
         }
 
-        internal static IAsyncEnumerator<T> Create<T>(Func<TaskCompletionSource<bool>, Task<bool>> moveNext, Func<T> current, Func<Task> dispose)
+        internal static IAsyncEnumerator<T> Create<T>(Func<TaskCompletionSource<bool>, ValueTask<bool>> moveNext, Func<T> current, Func<ValueTask> dispose)
         {
             return new AnonymousAsyncIterator<T>(
                 async () =>
@@ -107,10 +107,10 @@ namespace System.Collections.Generic
         private sealed class AnonymousAsyncIterator<T> : AsyncIterator<T>
         {
             private readonly Func<T> currentFunc;
-            private readonly Func<Task<bool>> moveNext;
-            private Func<Task> dispose;
+            private readonly Func<ValueTask<bool>> moveNext;
+            private Func<ValueTask> dispose;
 
-            public AnonymousAsyncIterator(Func<Task<bool>> moveNext, Func<T> currentFunc, Func<Task> dispose)
+            public AnonymousAsyncIterator(Func<ValueTask<bool>> moveNext, Func<T> currentFunc, Func<ValueTask> dispose)
             {
                 Debug.Assert(moveNext != null);
 
@@ -127,7 +127,7 @@ namespace System.Collections.Generic
                 throw new NotSupportedException("AnonymousAsyncIterator cannot be cloned. It is only intended for use as an iterator.");
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 var dispose = Interlocked.Exchange(ref this.dispose, null);
 
@@ -139,7 +139,7 @@ namespace System.Collections.Generic
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 3 - 3
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncIterator.cs

@@ -43,7 +43,7 @@ namespace System.Linq
             return enumerator;
         }
 
-        public virtual Task DisposeAsync()
+        public virtual ValueTask DisposeAsync()
         {
             current = default(TSource);
             state = AsyncIteratorState.Disposed;
@@ -62,7 +62,7 @@ namespace System.Linq
             }
         }
 
-        public async Task<bool> MoveNextAsync()
+        public async ValueTask<bool> MoveNextAsync()
         {
             // Note: MoveNext *must* be implemented as an async method to ensure
             // that any exceptions thrown from the MoveNextCore call are handled 
@@ -111,7 +111,7 @@ namespace System.Linq
             return new AsyncEnumerable.WhereEnumerableAsyncIteratorWithTask<TSource>(this, predicate);
         }
 
-        protected abstract Task<bool> MoveNextCore();
+        protected abstract ValueTask<bool> MoveNextCore();
 
         protected virtual void OnGetEnumerator()
         {

+ 1 - 1
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncListPartition.cs

@@ -38,7 +38,7 @@ namespace System.Linq
             return new AsyncListPartition<TSource>(_source, _minIndexInclusive, _maxIndexInclusive);
         }
 
-        protected override async Task<bool> MoveNextCore()
+        protected override async ValueTask<bool> MoveNextCore()
         {
             if ((uint)_index <= (uint)(_maxIndexInclusive - _minIndexInclusive) && _index < _source.Count - _minIndexInclusive)
             {

+ 4 - 4
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/AppendPrepend.cs

@@ -75,7 +75,7 @@ namespace System.Linq
                 return false;
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -110,7 +110,7 @@ namespace System.Linq
                 return new AppendPrepend1AsyncIterator<TSource>(source, item, appending);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -304,7 +304,7 @@ namespace System.Linq
             int mode;
             IEnumerator<TSource> appendedEnumerator;
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (appendedEnumerator != null)
                 {
@@ -315,7 +315,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Concat.cs

@@ -126,7 +126,7 @@ namespace System.Linq
                 return count;
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -137,7 +137,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 if (state == AsyncIteratorState.Allocated)
                 {

+ 7 - 7
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Create.cs

@@ -27,12 +27,12 @@ namespace System.Linq
             return new AnonymousAsyncEnumerableWithTask<T>(getEnumerator);
         }
 
-        public static IAsyncEnumerator<T> CreateEnumerator<T>(Func<Task<bool>> moveNext, Func<T> current, Func<Task> dispose)
+        public static IAsyncEnumerator<T> CreateEnumerator<T>(Func<ValueTask<bool>> moveNext, Func<T> current, Func<ValueTask> dispose)
         {
             return AsyncEnumerator.Create(moveNext, current, dispose);
         }
 
-        private static IAsyncEnumerator<T> CreateEnumerator<T>(Func<TaskCompletionSource<bool>, Task<bool>> moveNext, Func<T> current, Func<Task> dispose)
+        private static IAsyncEnumerator<T> CreateEnumerator<T>(Func<TaskCompletionSource<bool>, ValueTask<bool>> moveNext, Func<T> current, Func<ValueTask> dispose)
         {
             return AsyncEnumerator.Create(moveNext, current, dispose);
         }
@@ -87,7 +87,7 @@ namespace System.Linq
                     }
                 }
 
-                public async Task DisposeAsync()
+                public async ValueTask DisposeAsync()
                 {
                     var old = Interlocked.Exchange(ref enumerator, DisposedEnumerator.Instance);
 
@@ -97,7 +97,7 @@ namespace System.Linq
                     }
                 }
 
-                public Task<bool> MoveNextAsync()
+                public ValueTask<bool> MoveNextAsync()
                 {
                     if (enumerator == null)
                     {
@@ -107,7 +107,7 @@ namespace System.Linq
                     return enumerator.MoveNextAsync();
                 }
 
-                private async Task<bool> InitAndMoveNextAsync()
+                private async ValueTask<bool> InitAndMoveNextAsync()
                 {
                     try
                     {
@@ -132,9 +132,9 @@ namespace System.Linq
 
                     public T Current => throw new ObjectDisposedException("this");
 
-                    public Task DisposeAsync() => TaskExt.CompletedTask;
+                    public ValueTask DisposeAsync() => TaskExt.CompletedTask;
 
-                    public Task<bool> MoveNextAsync() => throw new ObjectDisposedException("this");
+                    public ValueTask<bool> MoveNextAsync() => throw new ObjectDisposedException("this");
                 }
             }
         }

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/DefaultIfEmpty.cs

@@ -52,7 +52,7 @@ namespace System.Linq
                 return new DefaultIfEmptyAsyncIterator<TSource>(source, defaultValue);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -63,7 +63,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Distinct.cs

@@ -67,7 +67,7 @@ namespace System.Linq
                 return new DistinctAsyncIterator<TSource>(source, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -79,7 +79,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Empty.cs

@@ -40,11 +40,11 @@ namespace System.Linq
 
             public Task<Maybe<TValue>> TryGetLastAsync(CancellationToken cancellationToken) => Task.FromResult(new Maybe<TValue>());
 
-            public Task<bool> MoveNextAsync() => TaskExt.False;
+            public ValueTask<bool> MoveNextAsync() => TaskExt.False;
 
             public IAsyncEnumerator<TValue> GetAsyncEnumerator() => this;
 
-            public Task DisposeAsync() => TaskExt.CompletedTask;
+            public ValueTask DisposeAsync() => TaskExt.CompletedTask;
         }
     }
 }

+ 3 - 3
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Except.cs

@@ -61,7 +61,7 @@ namespace System.Linq
                 return new ExceptAsyncIterator<TSource>(first, second, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (firstEnumerator != null)
                 {
@@ -74,7 +74,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -95,7 +95,7 @@ namespace System.Linq
                             {
                                 // This is here so we don't need to call Task.WhenAll each time after the set is filled
                                 var moveNextTask = firstEnumerator.MoveNextAsync();
-                                await Task.WhenAll(moveNextTask, fillSetTask).ConfigureAwait(false);
+                                await Task.WhenAll(moveNextTask.AsTask(), fillSetTask).ConfigureAwait(false);
 
                                 setFilled = true;
                                 moveNext = moveNextTask.Result;

+ 12 - 12
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/GroupBy.cs

@@ -247,7 +247,7 @@ namespace System.Linq
                 return new GroupedResultAsyncEnumerable<TSource, TKey, TResult>(source, keySelector, resultSelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -259,7 +259,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -336,7 +336,7 @@ namespace System.Linq
                 return new GroupedResultAsyncEnumerableWithTask<TSource, TKey, TResult>(source, keySelector, resultSelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -348,7 +348,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -425,7 +425,7 @@ namespace System.Linq
                 return new GroupedAsyncEnumerable<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -437,7 +437,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -514,7 +514,7 @@ namespace System.Linq
                 return new GroupedAsyncEnumerableWithTask<TSource, TKey, TElement>(source, keySelector, elementSelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -526,7 +526,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -599,7 +599,7 @@ namespace System.Linq
             {
                 return new GroupedAsyncEnumerable<TSource, TKey>(source, keySelector, comparer);
             }
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -611,7 +611,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -684,7 +684,7 @@ namespace System.Linq
             {
                 return new GroupedAsyncEnumerableWithTask<TSource, TKey>(source, keySelector, comparer);
             }
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -696,7 +696,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/GroupJoin.cs

@@ -138,7 +138,7 @@ namespace System.Linq
                     _comparer = comparer;
                 }
 
-                public async Task<bool> MoveNextAsync()
+                public async ValueTask<bool> MoveNextAsync()
                 {
                     // nothing to do 
                     if (!await _outer.MoveNextAsync().ConfigureAwait(false))
@@ -163,7 +163,7 @@ namespace System.Linq
 
                 public TResult Current { get; private set; }
 
-                public Task DisposeAsync() => _outer.DisposeAsync();
+                public ValueTask DisposeAsync() => _outer.DisposeAsync();
             }
         }
 
@@ -228,7 +228,7 @@ namespace System.Linq
                     _comparer = comparer;
                 }
 
-                public async Task<bool> MoveNextAsync()
+                public async ValueTask<bool> MoveNextAsync()
                 {
                     // nothing to do 
                     if (!await _outer.MoveNextAsync().ConfigureAwait(false))
@@ -253,7 +253,7 @@ namespace System.Linq
 
                 public TResult Current { get; private set; }
 
-                public Task DisposeAsync() => _outer.DisposeAsync();
+                public ValueTask DisposeAsync() => _outer.DisposeAsync();
             }
         }
     }

+ 3 - 3
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Intersect.cs

@@ -61,7 +61,7 @@ namespace System.Linq
                 return new IntersectAsyncIterator<TSource>(first, second, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (firstEnumerator != null)
                 {
@@ -74,7 +74,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -96,7 +96,7 @@ namespace System.Linq
                             {
                                 // This is here so we don't need to call Task.WhenAll each time after the set is filled
                                 var moveNextTask = firstEnumerator.MoveNextAsync();
-                                await Task.WhenAll(moveNextTask, fillSetTask).ConfigureAwait(false);
+                                await Task.WhenAll(moveNextTask.AsTask(), fillSetTask).ConfigureAwait(false);
                                 setFilled = true;
                                 moveNext = moveNextTask.Result;
                             }

+ 4 - 4
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Join.cs

@@ -111,7 +111,7 @@ namespace System.Linq
                 return new JoinAsyncIterator<TOuter, TInner, TKey, TResult>(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (outerEnumerator != null)
                 {
@@ -135,7 +135,7 @@ namespace System.Linq
             private const int State_For = 3;
             private const int State_While = 4;
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -239,7 +239,7 @@ namespace System.Linq
                 return new JoinAsyncIteratorWithTask<TOuter, TInner, TKey, TResult>(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (outerEnumerator != null)
                 {
@@ -263,7 +263,7 @@ namespace System.Linq
             private const int State_For = 3;
             private const int State_While = 4;
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 4 - 4
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/OrderedAsyncEnumerable.cs

@@ -54,7 +54,7 @@ namespace System.Linq
             return new OrderedAsyncEnumerable<TElement, TKey>(source, keySelector, comparer, descending, parent);
         }
 
-        public override async Task DisposeAsync()
+        public override async ValueTask DisposeAsync()
         {
             if (enumerator != null)
             {
@@ -71,7 +71,7 @@ namespace System.Linq
             await base.DisposeAsync().ConfigureAwait(false);
         }
 
-        protected override async Task<bool> MoveNextCore()
+        protected override async ValueTask<bool> MoveNextCore()
         {
             switch (state)
             {
@@ -141,7 +141,7 @@ namespace System.Linq
             return new OrderedAsyncEnumerableWithTask<TElement, TKey>(source, keySelector, comparer, descending, parent);
         }
 
-        public override async Task DisposeAsync()
+        public override async ValueTask DisposeAsync()
         {
             if (enumerator != null)
             {
@@ -158,7 +158,7 @@ namespace System.Linq
             await base.DisposeAsync().ConfigureAwait(false);
         }
 
-        protected override async Task<bool> MoveNextCore()
+        protected override async ValueTask<bool> MoveNextCore()
         {
             switch (state)
             {

+ 1 - 1
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Range.cs

@@ -107,7 +107,7 @@ namespace System.Linq
 
             public Task<Maybe<int>> TryGetLastAsync(CancellationToken cancellationToken) => Task.FromResult(new Maybe<int>(end - 1));
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 1 - 1
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Repeat.cs

@@ -58,7 +58,7 @@ namespace System.Linq
                 return Task.FromResult(res);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Reverse.cs

@@ -83,13 +83,13 @@ namespace System.Linq
                 return new ReverseAsyncIterator<TSource>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 items = null; // Just in case this ends up being long-lived, allow the memory to be reclaimed.
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 12 - 12
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Select.cs

@@ -102,7 +102,7 @@ namespace System.Linq
                 return new SelectEnumerableAsyncIterator<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -118,7 +118,7 @@ namespace System.Linq
                 return new SelectEnumerableAsyncIterator<TSource, TResult1>(source, CombineSelectors(this.selector, selector));
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -163,7 +163,7 @@ namespace System.Linq
                 return new SelectEnumerableWithIndexAsyncIterator<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -174,7 +174,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -223,7 +223,7 @@ namespace System.Linq
                 return new SelectIListIterator<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -289,7 +289,7 @@ namespace System.Linq
                 return Task.FromResult(res);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -334,7 +334,7 @@ namespace System.Linq
                 return new SelectEnumerableAsyncIteratorWithTask<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -350,7 +350,7 @@ namespace System.Linq
                 return new SelectEnumerableAsyncIteratorWithTask<TSource, TResult1>(source, CombineSelectors(this.selector, selector));
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -395,7 +395,7 @@ namespace System.Linq
                 return new SelectEnumerableWithIndexAsyncIteratorWithTask<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -406,7 +406,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -460,7 +460,7 @@ namespace System.Linq
                 return new SelectIListIteratorWithTask<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -526,7 +526,7 @@ namespace System.Linq
                 return res;
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 16 - 16
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SelectMany.cs

@@ -124,7 +124,7 @@ namespace System.Linq
                 return new SelectManyAsyncIterator<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -141,7 +141,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -215,7 +215,7 @@ namespace System.Linq
                 return new SelectManyAsyncIteratorWithTask<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -232,7 +232,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -310,7 +310,7 @@ namespace System.Linq
                 return new SelectManyAsyncIterator<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -329,7 +329,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -408,7 +408,7 @@ namespace System.Linq
                 return new SelectManyAsyncIteratorWithTask<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -427,7 +427,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -507,7 +507,7 @@ namespace System.Linq
                 return new SelectManyWithIndexAsyncIterator<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -526,7 +526,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -613,7 +613,7 @@ namespace System.Linq
                 return new SelectManyWithIndexAsyncIteratorWithTask<TSource, TCollection, TResult>(source, collectionSelector, resultSelector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -632,7 +632,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -715,7 +715,7 @@ namespace System.Linq
                 return new SelectManyWithIndexAsyncIterator<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -732,7 +732,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -813,7 +813,7 @@ namespace System.Linq
                 return new SelectManyWithIndexAsyncIteratorWithTask<TSource, TResult>(source, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (sourceEnumerator != null)
                 {
@@ -830,7 +830,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SkipLast.cs

@@ -51,7 +51,7 @@ namespace System.Linq
                 return new SkipLastAsyncIterator<TSource>(source, count);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -65,7 +65,7 @@ namespace System.Linq
             }
 
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 8 - 8
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/SkipWhile.cs

@@ -72,7 +72,7 @@ namespace System.Linq
                 return new SkipWhileAsyncIterator<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -83,7 +83,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -149,7 +149,7 @@ namespace System.Linq
                 return new SkipWhileWithIndexAsyncIterator<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -160,7 +160,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -231,7 +231,7 @@ namespace System.Linq
                 return new SkipWhileAsyncIteratorWithTask<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -242,7 +242,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -308,7 +308,7 @@ namespace System.Linq
                 return new SkipWhileWithIndexAsyncIteratorWithTask<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -319,7 +319,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/TakeLast.cs

@@ -45,7 +45,7 @@ namespace System.Linq
                 return new TakeLastAsyncIterator<TSource>(source, count);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -58,7 +58,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 8 - 8
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/TakeWhile.cs

@@ -71,7 +71,7 @@ namespace System.Linq
                 return new TakeWhileAsyncIterator<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -82,7 +82,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -136,7 +136,7 @@ namespace System.Linq
                 return new TakeWhileWithIndexAsyncIterator<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -147,7 +147,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -205,7 +205,7 @@ namespace System.Linq
                 return new TakeWhileAsyncIteratorWithTask<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -216,7 +216,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -270,7 +270,7 @@ namespace System.Linq
                 return new TakeWhileWithIndexAsyncIteratorWithTask<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -281,7 +281,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 9 - 9
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToAsyncEnumerable.cs

@@ -49,7 +49,7 @@ namespace System.Linq
                             return false;
                         },
                         () => value,
-                        () => TaskExt.True);
+                        () => TaskExt.CompletedTask);
                 });
         }
 
@@ -106,14 +106,14 @@ namespace System.Linq
                                 tcs.TrySetException(error);
                             }
 
-                            return tcs.Task;
+                            return new ValueTask<bool>(tcs.Task);
                         },
                         () => observer.Current,
                         () =>
                         {
                             subscription.Dispose();
                             // Should we cancel in-flight operations somehow?
-                            return TaskExt.True;
+                            return TaskExt.CompletedTask;
                         });
                 });
         }
@@ -136,7 +136,7 @@ namespace System.Linq
                 return new AsyncEnumerableAdapter<T>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -147,7 +147,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -205,7 +205,7 @@ namespace System.Linq
                 return new AsyncIListEnumerableAdapter<T>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -216,7 +216,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -308,7 +308,7 @@ namespace System.Linq
                 return new AsyncICollectionEnumerableAdapter<T>(source);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -319,7 +319,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 2 - 1
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToEnumerable.cs

@@ -34,7 +34,8 @@ namespace System.Linq
             }
             finally
             {
-                e.DisposeAsync().Wait();
+                // Wait
+                e.DisposeAsync().GetAwaiter().GetResult();
             }
         }
     }

+ 1 - 1
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/ToObservable.cs

@@ -31,7 +31,7 @@ namespace System.Linq
                 var e = source.GetAsyncEnumerator();
 
                 var f = default(Action);
-                f = () => e.MoveNextAsync().ContinueWith(
+                f = () => e.MoveNextAsync().AsTask().ContinueWith(
                     async t =>
                     {
                         if (t.IsFaulted)

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Union.cs

@@ -54,7 +54,7 @@ namespace System.Linq
                 _comparer = comparer;
             }
 
-            public sealed override async Task DisposeAsync()
+            public sealed override async ValueTask DisposeAsync()
             {
                 if (_enumerator != null)
                 {
@@ -107,7 +107,7 @@ namespace System.Linq
                 return false;
             }
 
-            protected sealed override async Task<bool> MoveNextCore()
+            protected sealed override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 10 - 10
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Where.cs

@@ -102,7 +102,7 @@ namespace System.Linq
                 return new WhereEnumerableAsyncIterator<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -123,7 +123,7 @@ namespace System.Linq
                 return new WhereEnumerableAsyncIterator<TSource>(source, CombinePredicates(this.predicate, predicate));
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -173,7 +173,7 @@ namespace System.Linq
                 return new WhereEnumerableWithIndexAsyncIterator<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -184,7 +184,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -237,7 +237,7 @@ namespace System.Linq
                 return new WhereEnumerableAsyncIteratorWithTask<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -253,7 +253,7 @@ namespace System.Linq
                 return new WhereEnumerableAsyncIteratorWithTask<TSource>(source, CombinePredicates(this.predicate, predicate));
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -303,7 +303,7 @@ namespace System.Linq
                 return new WhereEnumerableWithIndexAsyncIteratorWithTask<TSource>(source, predicate);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -314,7 +314,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -371,7 +371,7 @@ namespace System.Linq
                 return new WhereSelectEnumerableAsyncIterator<TSource, TResult>(source, predicate, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (enumerator != null)
                 {
@@ -387,7 +387,7 @@ namespace System.Linq
                 return new WhereSelectEnumerableAsyncIterator<TSource, TResult1>(source, predicate, CombineSelectors(this.selector, selector));
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {

+ 7 - 6
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Zip.cs

@@ -59,7 +59,7 @@ namespace System.Linq
                 return new ZipAsyncIterator<TFirst, TSecond, TResult>(first, second, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (firstEnumerator != null)
                 {
@@ -76,7 +76,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -92,7 +92,8 @@ namespace System.Linq
                         // We kick these off and join so they can potentially run in parallel
                         var ft = firstEnumerator.MoveNextAsync();
                         var st = secondEnumerator.MoveNextAsync();
-                        await Task.WhenAll(ft, st).ConfigureAwait(false);
+                        
+                        await Task.WhenAll(ft.AsTask(), st.AsTask()).ConfigureAwait(false);
 
                         if (ft.Result && st.Result)
                         {
@@ -133,7 +134,7 @@ namespace System.Linq
                 return new ZipAsyncIteratorWithTask<TFirst, TSecond, TResult>(first, second, selector);
             }
 
-            public override async Task DisposeAsync()
+            public override async ValueTask DisposeAsync()
             {
                 if (firstEnumerator != null)
                 {
@@ -150,7 +151,7 @@ namespace System.Linq
                 await base.DisposeAsync().ConfigureAwait(false);
             }
 
-            protected override async Task<bool> MoveNextCore()
+            protected override async ValueTask<bool> MoveNextCore()
             {
                 switch (state)
                 {
@@ -166,7 +167,7 @@ namespace System.Linq
                         // We kick these off and join so they can potentially run in parallel
                         var ft = firstEnumerator.MoveNextAsync();
                         var st = secondEnumerator.MoveNextAsync();
-                        await Task.WhenAll(ft, st).ConfigureAwait(false);
+                        await Task.WhenAll(ft.AsTask(), st.AsTask()).ConfigureAwait(false);
 
                         if (ft.Result && st.Result)
                         {

+ 2 - 2
Ix.NET/Source/System.Linq.Async/System/Threading/Tasks/AsyncEnumerableExtensions.cs

@@ -44,12 +44,12 @@ namespace System.Threading.Tasks
                         _continueOnCapturedContext = continueOnCapturedContext;
                     }
 
-                    public ConfiguredTaskAwaitable<bool> MoveNextAsync() =>
+                    public ConfiguredValueTaskAwaitable<bool> MoveNextAsync() =>
                         _enumerator.MoveNextAsync().ConfigureAwait(_continueOnCapturedContext);
 
                     public T Current => _enumerator.Current;
 
-                    public ConfiguredTaskAwaitable DisposeAsync() =>
+                    public ConfiguredValueTaskAwaitable DisposeAsync() =>
                         _enumerator.DisposeAsync().ConfigureAwait(_continueOnCapturedContext);
                 }
             }

+ 3 - 3
Ix.NET/Source/System.Linq.Async/System/Threading/Tasks/TaskExt.cs

@@ -6,8 +6,8 @@ namespace System.Threading.Tasks
 {
     internal static class TaskExt
     {
-        public static readonly Task<bool> True = Task.FromResult(true);
-        public static readonly Task<bool> False = Task.FromResult(false);
-        public static readonly Task CompletedTask = True;
+        public static readonly ValueTask<bool> True = new ValueTask<bool>(true);
+        public static readonly ValueTask<bool> False = new ValueTask<bool>(false);
+        public static readonly ValueTask CompletedTask = new ValueTask(Task.FromResult(true));
     }
 }