浏览代码

Check for cancellation in a few more places.

Bart De Smet 6 年之前
父节点
当前提交
aa2430bb42

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

@@ -20,6 +20,8 @@ namespace System.Collections.Generic
 
         internal static async ValueTask<ArrayWithLength<T>> ToArrayWithLength<T>(IAsyncEnumerable<T> source, CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var result = new ArrayWithLength<T>();
             // Check for short circuit optimizations. This one is very unlikely
             // but could be here as a group

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

@@ -185,6 +185,8 @@ namespace System.Linq
                     return await AsyncEnumerableHelpers.ToArray(this, cancellationToken).ConfigureAwait(false);
                 }
 
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var array = new TSource[count];
                 int index;
                 if (_appending)
@@ -230,6 +232,9 @@ namespace System.Linq
             public override async ValueTask<List<TSource>> ToListAsync(CancellationToken cancellationToken)
             {
                 var count = await GetCountAsync(onlyIfCheap: true, cancellationToken).ConfigureAwait(false);
+
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var list = count == -1 ? new List<TSource>() : new List<TSource>(count);
 
                 if (!_appending)
@@ -237,7 +242,6 @@ namespace System.Linq
                     list.Add(_item);
                 }
 
-
                 var en = _source.GetAsyncEnumerator(cancellationToken);
 
                 try

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

@@ -73,6 +73,8 @@ namespace System.Linq
 
             public async ValueTask<List<TSource>> ToListAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var list = new List<TSource>();
                 for (var i = 0; ; i++)
                 {
@@ -111,6 +113,8 @@ namespace System.Linq
 
                 async ValueTask<int> Core()
                 {
+                    cancellationToken.ThrowIfCancellationRequested();
+
                     var count = 0;
                     for (var i = 0; ; i++)
                     {

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

@@ -281,6 +281,8 @@ namespace System.Linq.Internal
 
         ValueTask<List<IAsyncGrouping<TKey, TElement>>> IAsyncIListProvider<IAsyncGrouping<TKey, TElement>>.ToListAsync(CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var list = new List<IAsyncGrouping<TKey, TElement>>(Count);
             var g = _lastGrouping;
             if (g != null)
@@ -298,6 +300,8 @@ namespace System.Linq.Internal
 
         ValueTask<IAsyncGrouping<TKey, TElement>[]> IAsyncIListProvider<IAsyncGrouping<TKey, TElement>>.ToArrayAsync(CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var array = new IAsyncGrouping<TKey, TElement>[Count];
             var index = 0;
             var g = _lastGrouping;
@@ -608,6 +612,8 @@ namespace System.Linq.Internal
 #if !NO_DEEP_CANCELLATION
         internal async Task<TResult[]> ToArray<TResult>(Func<TKey, IAsyncEnumerable<TElement>, CancellationToken, ValueTask<TResult>> resultSelector, CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var array = new TResult[Count];
             var index = 0;
             var g = _lastGrouping;
@@ -648,6 +654,8 @@ namespace System.Linq.Internal
 #if !NO_DEEP_CANCELLATION
         internal async Task<List<TResult>> ToList<TResult>(Func<TKey, IAsyncEnumerable<TElement>, CancellationToken, ValueTask<TResult>> resultSelector, CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var list = new List<TResult>(Count);
             var g = _lastGrouping;
             if (g != null)
@@ -696,6 +704,8 @@ namespace System.Linq.Internal
 
         ValueTask<List<IAsyncGrouping<TKey, TElement>>> IAsyncIListProvider<IAsyncGrouping<TKey, TElement>>.ToListAsync(CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var list = new List<IAsyncGrouping<TKey, TElement>>(Count);
             var g = _lastGrouping;
             if (g != null)
@@ -713,6 +723,8 @@ namespace System.Linq.Internal
 
         ValueTask<IAsyncGrouping<TKey, TElement>[]> IAsyncIListProvider<IAsyncGrouping<TKey, TElement>>.ToArrayAsync(CancellationToken cancellationToken)
         {
+            cancellationToken.ThrowIfCancellationRequested();
+
             var array = new IAsyncGrouping<TKey, TElement>[Count];
             var index = 0;
             var g = _lastGrouping;

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

@@ -36,6 +36,8 @@ namespace System.Linq
 
             public ValueTask<TResult[]> ToArrayAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var res = new TResult[_count];
 
                 for (var i = 0; i < _count; i++)
@@ -48,6 +50,8 @@ namespace System.Linq
 
             public ValueTask<List<TResult>> ToListAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var res = new List<TResult>(_count);
 
                 for (var i = 0; i < _count; i++)

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

@@ -279,6 +279,8 @@ namespace System.Linq
                     return new ValueTask<int>(-1);
                 }
 
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var count = 0;
 
                 foreach (var item in _source)
@@ -301,6 +303,8 @@ namespace System.Linq
 
             public ValueTask<TResult[]> ToArrayAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var n = _source.Count;
 
                 var res = new TResult[n];
@@ -315,6 +319,8 @@ namespace System.Linq
 
             public ValueTask<List<TResult>> ToListAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var n = _source.Count;
 
                 var res = new List<TResult>(n);
@@ -652,6 +658,8 @@ namespace System.Linq
 
                 async ValueTask<int> Core()
                 {
+                    cancellationToken.ThrowIfCancellationRequested();
+
                     var count = 0;
 
                     foreach (var item in _source)
@@ -675,6 +683,8 @@ namespace System.Linq
 
             public async ValueTask<TResult[]> ToArrayAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var n = _source.Count;
 
                 var res = new TResult[n];
@@ -689,6 +699,8 @@ namespace System.Linq
 
             public async ValueTask<List<TResult>> ToListAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var n = _source.Count;
 
                 var res = new List<TResult>(n);
@@ -768,6 +780,8 @@ namespace System.Linq
 
                 async ValueTask<int> Core()
                 {
+                    cancellationToken.ThrowIfCancellationRequested();
+
                     var count = 0;
 
                     foreach (var item in _source)
@@ -791,6 +805,8 @@ namespace System.Linq
 
             public async ValueTask<TResult[]> ToArrayAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var n = _source.Count;
 
                 var res = new TResult[n];
@@ -805,6 +821,8 @@ namespace System.Linq
 
             public async ValueTask<List<TResult>> ToListAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var n = _source.Count;
 
                 var res = new List<TResult>(n);

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

@@ -82,11 +82,26 @@ namespace System.Linq
             //     and short-circuit as appropriate.
             //
 
-            public ValueTask<T[]> ToArrayAsync(CancellationToken cancellationToken) => new ValueTask<T[]>(_source.ToArray());
+            public ValueTask<T[]> ToArrayAsync(CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
+
+                return new ValueTask<T[]>(_source.ToArray());
+            }
+
+            public ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
+
+                return new ValueTask<List<T>>(_source.ToList());
+            }
 
-            public ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken) => new ValueTask<List<T>>(_source.ToList());
+            public ValueTask<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
 
-            public ValueTask<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken) => new ValueTask<int>(_source.Count());
+                return new ValueTask<int>(_source.Count());
+            }
         }
 
         private sealed class AsyncIListEnumerableAdapter<T> : AsyncIterator<T>, IAsyncIListProvider<T>, IList<T>
@@ -144,11 +159,26 @@ namespace System.Linq
             //     and short-circuit as appropriate.
             //
 
-            public ValueTask<T[]> ToArrayAsync(CancellationToken cancellationToken) => new ValueTask<T[]>(_source.ToArray());
+            public ValueTask<T[]> ToArrayAsync(CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
 
-            public ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken) => new ValueTask<List<T>>(_source.ToList());
+                return new ValueTask<T[]>(_source.ToArray());
+            }
 
-            public ValueTask<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken) => new ValueTask<int>(_source.Count);
+            public ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
+
+                return new ValueTask<List<T>>(_source.ToList());
+            }
+
+            public ValueTask<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
+
+                return new ValueTask<int>(_source.Count);
+            }
 
             IEnumerator<T> IEnumerable<T>.GetEnumerator() => _source.GetEnumerator();
 
@@ -234,11 +264,26 @@ namespace System.Linq
             //     and short-circuit as appropriate.
             //
 
-            public ValueTask<T[]> ToArrayAsync(CancellationToken cancellationToken) => new ValueTask<T[]>(_source.ToArray());
+            public ValueTask<T[]> ToArrayAsync(CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
 
-            public ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken) => new ValueTask<List<T>>(_source.ToList());
+                return new ValueTask<T[]>(_source.ToArray());
+            }
 
-            public ValueTask<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken) => new ValueTask<int>(_source.Count);
+            public ValueTask<List<T>> ToListAsync(CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
+
+                return new ValueTask<List<T>>(_source.ToList());
+            }
+
+            public ValueTask<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken)
+            {
+                cancellationToken.ThrowIfCancellationRequested();
+
+                return new ValueTask<int>(_source.Count);
+            }
 
             IEnumerator<T> IEnumerable<T>.GetEnumerator() => _source.GetEnumerator();
 

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

@@ -162,6 +162,8 @@ namespace System.Linq
 
             private async Task<Set<TSource>> FillSetAsync(CancellationToken cancellationToken)
             {
+                cancellationToken.ThrowIfCancellationRequested();
+
                 var set = new Set<TSource>(_comparer);
 
                 for (var index = 0; ; ++index)