浏览代码

Link cancellation tokens.

Bart De Smet 7 年之前
父节点
当前提交
faed6f3977
共有 1 个文件被更改,包括 18 次插入1 次删除
  1. 18 1
      Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerable.WithCancellation.cs

+ 18 - 1
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncEnumerable.WithCancellation.cs

@@ -38,7 +38,24 @@ namespace System.Linq
             // REVIEW: [LDM-2018-11-28] Should we have eager cancellation here too?
             // REVIEW: [LDM-2018-11-28] Should we have eager cancellation here too?
 
 
             public WithCancellationAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken)
             public WithCancellationAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken)
-                => new WithCancellationAsyncEnumerator(_source.GetAsyncEnumerator(_cancellationToken));
+            {
+                CancellationToken token;
+
+                if (cancellationToken == default)
+                {
+                    token = _cancellationToken;
+                }
+                else if (_cancellationToken == default)
+                {
+                    token = cancellationToken;
+                }
+                else
+                {
+                    token = CancellationTokenSource.CreateLinkedTokenSource(_cancellationToken, cancellationToken).Token;
+                }
+
+                return new WithCancellationAsyncEnumerator(_source.GetAsyncEnumerator(token));
+            }
 
 
             IAsyncEnumerator<T> IAsyncEnumerable<T>.GetAsyncEnumerator(CancellationToken cancellationToken)
             IAsyncEnumerator<T> IAsyncEnumerable<T>.GetAsyncEnumerator(CancellationToken cancellationToken)
                 => GetAsyncEnumerator(cancellationToken);
                 => GetAsyncEnumerator(cancellationToken);