Просмотр исходного кода

Centralizing continuation setup code.

Bart De Smet 10 лет назад
Родитель
Сommit
6af0299c50

+ 28 - 28
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Aggregates.cs

@@ -25,7 +25,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -89,7 +89,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -173,7 +173,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -215,7 +215,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -281,7 +281,7 @@ namespace System.Linq
 
             var e = source.GetEnumerator();
 
-            e.MoveNext(cancellationToken).ContinueWith(t =>
+            e.MoveNext(cancellationToken).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -314,7 +314,7 @@ namespace System.Linq
 
             var e = source.GetEnumerator();
 
-            e.MoveNext(cancellationToken).ContinueWith(t =>
+            e.MoveNext(cancellationToken).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -350,7 +350,7 @@ namespace System.Linq
             var hasLast = false;
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -397,7 +397,7 @@ namespace System.Linq
             var hasLast = false;
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -441,14 +441,14 @@ namespace System.Linq
 
             var e = source.GetEnumerator();
 
-            e.MoveNext(cancellationToken).ContinueWith(t =>
+            e.MoveNext(cancellationToken).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
                     if (res)
                     {
                         var result = e.Current;
-                        e.MoveNext(cancellationToken).ContinueWith(t1 =>
+                        e.MoveNext(cancellationToken).Then(t1 =>
                         {
                             t1.Handle(tcs, res1 =>
                             {
@@ -486,14 +486,14 @@ namespace System.Linq
 
             var e = source.GetEnumerator();
 
-            e.MoveNext(cancellationToken).ContinueWith(t =>
+            e.MoveNext(cancellationToken).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
                     if (res)
                     {
                         var result = e.Current;
-                        e.MoveNext(cancellationToken).ContinueWith(t1 =>
+                        e.MoveNext(cancellationToken).Then(t1 =>
                         {
                             t1.Handle(tcs, res1 =>
                             {
@@ -534,7 +534,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var next = default(Action<CancellationToken>);
-            next = ct => e.MoveNext(ct).ContinueWith(t =>
+            next = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -574,7 +574,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var next = default(Action<CancellationToken>);
-            next = ct => e.MoveNext(ct).ContinueWith(t =>
+            next = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -774,7 +774,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -812,7 +812,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -853,7 +853,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -891,7 +891,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -932,7 +932,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -970,7 +970,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -1011,7 +1011,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -1049,7 +1049,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -1090,7 +1090,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -1128,7 +1128,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {
@@ -1863,7 +1863,7 @@ namespace System.Linq
             if (source == null)
                 throw new ArgumentNullException("source");
 
-            return source.Any(cancellationToken).ContinueWith(t => !t.Result);
+            return source.Any(cancellationToken).Then(t => !t.Result);
         }
 
         public static Task<TSource> Min<TSource>(this IAsyncEnumerable<TSource> source, IComparer<TSource> comparer, CancellationToken cancellationToken)
@@ -1873,7 +1873,7 @@ namespace System.Linq
             if (comparer == null)
                 throw new ArgumentNullException("comparer");
 
-            return MinBy(source, x => x, comparer, cancellationToken).ContinueWith(t => t.Result.First());
+            return MinBy(source, x => x, comparer, cancellationToken).Then(t => t.Result.First());
         }
 
         public static Task<IList<TSource>> MinBy<TSource, TKey>(this IAsyncEnumerable<TSource> source, Func<TSource, TKey> keySelector, CancellationToken cancellationToken)
@@ -1905,7 +1905,7 @@ namespace System.Linq
             if (comparer == null)
                 throw new ArgumentNullException("comparer");
 
-            return MaxBy(source, x => x, comparer, cancellationToken).ContinueWith(t => t.Result.First());
+            return MaxBy(source, x => x, comparer, cancellationToken).Then(t => t.Result.First());
         }
 
         public static Task<IList<TSource>> MaxBy<TSource, TKey>(this IAsyncEnumerable<TSource> source, Func<TSource, TKey> keySelector, CancellationToken cancellationToken)
@@ -1943,7 +1943,7 @@ namespace System.Linq
             var e = source.GetEnumerator();
 
             var f = default(Action<CancellationToken>);
-            f = ct => e.MoveNext(ct).ContinueWith(t =>
+            f = ct => e.MoveNext(ct).Then(t =>
             {
                 t.Handle(tcs, res =>
                 {

+ 1 - 1
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Conversions.cs

@@ -77,7 +77,7 @@ namespace System.Linq
                     {
                         if (Interlocked.CompareExchange(ref called, 1, 0) == 0)
                         {
-                            task.ContinueWith(continuedTask =>
+                            task.Then(continuedTask =>
                             {
                                 if (continuedTask.IsCanceled)
                                     tcs.SetCanceled();

+ 1 - 1
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Creation.cs

@@ -248,7 +248,7 @@ namespace System.Linq
                 return Create(
                     (ct, tcs) =>
                     {
-                        e.MoveNext(cts.Token).ContinueWith(t =>
+                        e.MoveNext(cts.Token).Then(t =>
                         {
                             t.Handle(tcs,
                                 res =>

+ 5 - 5
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Exceptions.cs

@@ -31,7 +31,7 @@ namespace System.Linq
                 {
                     if (!done)
                     {
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs,
                                 res =>
@@ -76,7 +76,7 @@ namespace System.Linq
                     }
                     else
                     {
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -172,7 +172,7 @@ namespace System.Linq
                         a.Disposable = e;
                     }
 
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs,
                             res =>
@@ -221,7 +221,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -306,7 +306,7 @@ namespace System.Linq
                         a.Disposable = e;
                     }
 
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs,
                             res =>

+ 10 - 10
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Multiple.cs

@@ -26,7 +26,7 @@ namespace System.Linq
                 var d = Disposable.Create(cts, a);
 
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
-                f = (tcs, ct) => e.MoveNext(ct).ContinueWith(t =>
+                f = (tcs, ct) => e.MoveNext(ct).Then(t =>
                 {
                     t.Handle(tcs, res =>
                     {
@@ -92,7 +92,7 @@ namespace System.Linq
                             if (result)
                                 current = selector(e1.Current, e2.Current);
                             return result;
-                        }).ContinueWith(t =>
+                        }).Then(t =>
                         {
                             t.Handle(tcs, x => tcs.TrySetResult(x));
                         });
@@ -132,7 +132,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).Zip(getMapTask(ct), (b, _) => b).ContinueWith(t =>
+                    e.MoveNext(ct).Zip(getMapTask(ct), (b, _) => b).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -198,7 +198,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).Zip(getMapTask(ct), (b, _) => b).ContinueWith(t =>
+                    e.MoveNext(ct).Zip(getMapTask(ct), (b, _) => b).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -310,7 +310,7 @@ namespace System.Linq
                         tcs.TrySetResult(true);
                         return false;
                     }
-                }).ContinueWith(t =>
+                }).Then(t =>
                 {
                     t.Handle(tcs, res =>
                     {
@@ -374,11 +374,11 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    getInnerMap(ct).ContinueWith(ti =>
+                    getInnerMap(ct).Then(ti =>
                     {
                         ti.Handle(tcs, map =>
                         {
-                            outerE.MoveNext(ct).ContinueWith(to =>
+                            outerE.MoveNext(ct).Then(to =>
                             {
                                 to.Handle(tcs, res =>
                                 {
@@ -524,7 +524,7 @@ namespace System.Linq
                     });
 
                     if (b)
-                        oe.MoveNext(ct).ContinueWith(t =>
+                        oe.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -576,7 +576,7 @@ namespace System.Linq
                             });
                         });
                     else
-                        ie.MoveNext(ct).ContinueWith(t =>
+                        ie.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -711,7 +711,7 @@ namespace System.Linq
                         a.Disposable = e;
                     }
 
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {

+ 37 - 37
Ix.NET/Source/System.Interactive.Async/AsyncEnumerable.Single.cs

@@ -27,7 +27,7 @@ namespace System.Linq
                 return Create(
                     (ct, tcs) =>
                     {
-                        e.MoveNext(cts.Token).ContinueWith(t =>
+                        e.MoveNext(cts.Token).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -79,7 +79,7 @@ namespace System.Linq
                 return Create(
                     (ct, tcs) =>
                     {
-                        e.MoveNext(cts.Token).ContinueWith(t =>
+                        e.MoveNext(cts.Token).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -137,7 +137,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -195,7 +195,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -271,7 +271,7 @@ namespace System.Linq
 
                 inner = (tcs, ct) =>
                 {
-                    ie.MoveNext(ct).ContinueWith(t =>
+                    ie.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -290,7 +290,7 @@ namespace System.Linq
 
                 outer = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -366,7 +366,7 @@ namespace System.Linq
 
                 inner = (tcs, ct) =>
                 {
-                    ie.MoveNext(ct).ContinueWith(t =>
+                    ie.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -385,7 +385,7 @@ namespace System.Linq
 
                 outer = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -484,7 +484,7 @@ namespace System.Linq
                         if (n == 0)
                             return TaskExt.Return(false, cts.Token);
 
-                        e.MoveNext(cts.Token).ContinueWith(t =>
+                        e.MoveNext(cts.Token).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -522,7 +522,7 @@ namespace System.Linq
                 return Create(
                     (ct, tcs) =>
                     {
-                        e.MoveNext(cts.Token).ContinueWith(t =>
+                        e.MoveNext(cts.Token).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -576,7 +576,7 @@ namespace System.Linq
                 return Create(
                     (ct, tcs) =>
                     {
-                        e.MoveNext(cts.Token).ContinueWith(t =>
+                        e.MoveNext(cts.Token).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -631,14 +631,14 @@ namespace System.Linq
                 f = (tcs, ct) =>
                 {
                     if (n == 0)
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, x => tcs.TrySetResult(x));
                         });
                     else
                     {
                         --n;
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -682,7 +682,7 @@ namespace System.Linq
                 f = (tcs, ct) =>
                 {
                     if (skipping)
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -711,7 +711,7 @@ namespace System.Linq
                             });
                         });
                     else
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, x => tcs.TrySetResult(x));
                         });
@@ -749,7 +749,7 @@ namespace System.Linq
                 f = (tcs, ct) =>
                 {
                     if (skipping)
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -778,7 +778,7 @@ namespace System.Linq
                             });
                         });
                     else
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, x => tcs.TrySetResult(x));
                         });
@@ -817,7 +817,7 @@ namespace System.Linq
                     if (done)
                         tcs.TrySetResult(false);
                     else
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -903,14 +903,14 @@ namespace System.Linq
                     {
                         if (stack == null)
                         {
-                            Create(() => e).Aggregate(new Stack<TSource>(), (s, x) => { s.Push(x); return s; }, cts.Token).ContinueWith(t =>
+                            Create(() => e).Aggregate(new Stack<TSource>(), (s, x) => { s.Push(x); return s; }, cts.Token).Then(t =>
                             {
                                 t.Handle(tcs, res =>
                                 {
                                     stack = res;
                                     tcs.TrySetResult(stack.Count > 0);
                                 });
-                            }, cts.Token);
+                            });
                         }
                         else
                         {
@@ -946,7 +946,7 @@ namespace System.Linq
                             var tcs = new TaskCompletionSource<bool>();
                             if (current == null)
                             {
-                                source.ToList(ct).ContinueWith(t =>
+                                source.ToList(ct).Then(t =>
                                 {
                                     t.Handle(tcs, res =>
                                     {
@@ -1097,7 +1097,7 @@ namespace System.Linq
 
                     f = (tcs, ct) =>
                     {
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -1246,7 +1246,7 @@ namespace System.Linq
                         return task;
                     }
 
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs,
                             res =>
@@ -1308,7 +1308,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    iterateSource(ct).ContinueWith(t =>
+                    iterateSource(ct).Then(t =>
                     {
                         t.Handle(tcs,
                             res =>
@@ -1498,7 +1498,7 @@ namespace System.Linq
                     }
                     else
                     {
-                        iterateSource(ct).ContinueWith(t =>
+                        iterateSource(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -1600,7 +1600,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         if (!t.IsCanceled)
                         {
@@ -1692,7 +1692,7 @@ namespace System.Linq
             var f = default(Action<CancellationToken>);
             f = ct =>
             {
-                e.MoveNext(ct).ContinueWith(t =>
+                e.MoveNext(ct).Then(t =>
                 {
                     t.Handle(tcs, res =>
                     {
@@ -1762,7 +1762,7 @@ namespace System.Linq
                         a.Disposable = e;
                     }
 
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -1824,7 +1824,7 @@ namespace System.Linq
                         a.Disposable = e;
                     }
 
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -1869,7 +1869,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -1947,7 +1947,7 @@ namespace System.Linq
                 {
                     if (!stopped)
                     {
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -2088,7 +2088,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -2195,7 +2195,7 @@ namespace System.Linq
                     }
                     else
                     {
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -2260,7 +2260,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -2320,7 +2320,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {
@@ -2391,7 +2391,7 @@ namespace System.Linq
                 {
                     if (!done)
                     {
-                        e.MoveNext(ct).ContinueWith(t =>
+                        e.MoveNext(ct).Then(t =>
                         {
                             t.Handle(tcs, res =>
                             {
@@ -2459,7 +2459,7 @@ namespace System.Linq
                 var f = default(Action<TaskCompletionSource<bool>, CancellationToken>);
                 f = (tcs, ct) =>
                 {
-                    e.MoveNext(ct).ContinueWith(t =>
+                    e.MoveNext(ct).Then(t =>
                     {
                         t.Handle(tcs, res =>
                         {

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

@@ -23,12 +23,22 @@ namespace System.Threading.Tasks
 
         public static void Handle<T, R>(this Task<T> task, TaskCompletionSource<R> tcs, Action<T> success)
         {
-            Handle(task, tcs, success, ex => tcs.TrySetException(ex), () => tcs.TrySetCanceled());
+            if (task.IsFaulted)
+                tcs.TrySetException(task.Exception);
+            else if (task.IsCanceled)
+                tcs.TrySetCanceled();
+            else if (task.IsCompleted)
+                success(task.Result);
         }
 
         public static void Handle<T, R>(this Task<T> task, TaskCompletionSource<R> tcs, Action<T> success, Action<AggregateException> error)
         {
-            Handle(task, tcs, success, error, () => tcs.TrySetCanceled());
+            if (task.IsFaulted)
+                error(task.Exception);
+            else if (task.IsCanceled)
+                tcs.TrySetCanceled();
+            else if (task.IsCompleted)
+                success(task.Result);
         }
 
         public static void Handle<T, R>(this Task<T> task, TaskCompletionSource<R> tcs, Action<T> success, Action<AggregateException> error, Action canceled)
@@ -57,6 +67,26 @@ namespace System.Threading.Tasks
             return task;
         }
 
+        public static Task Then<T>(this Task<T> task, Action<Task<T>> continuation)
+        {
+            //
+            // Central location to deal with continuations; allows for experimentation with flags.
+            // Note that right now, we don't go for synchronous execution. Users can block on the
+            // task returned from MoveNext, which can cause deadlocks (e.g. typical uses of GroupBy
+            // involve some aggregate). We'd need deeper asynchrony to make this work with less
+            // spawning of tasks.
+            //
+            return task.ContinueWith(continuation);
+        }
+
+        public static Task<R> Then<T, R>(this Task<T> task, Func<Task<T>, R> continuation)
+        {
+            //
+            // See comment on Then<T> for rationale.
+            //
+            return task.ContinueWith(continuation);
+        }
+
         public static Task<bool> UsingEnumeratorSync(this Task<bool> task, IDisposable disposable)
         {
             var tcs = new TaskCompletionSource<bool>();