Use a TaskCompletionSource in non-generic ContinueWhenAny case. Fix #647.
authorJérémie Laval <jeremie.laval@gmail.com>
Tue, 6 Sep 2011 21:52:57 +0000 (23:52 +0200)
committerJérémie Laval <jeremie.laval@gmail.com>
Tue, 6 Sep 2011 21:54:11 +0000 (23:54 +0200)
mcs/class/corlib/System.Threading.Tasks/TaskFactory.cs

index 036d55a4206705896c542a6f5481b0f92e307fd6..03d5dd1244f3864300362404e3af783f00c8d570 100644 (file)
@@ -232,15 +232,16 @@ namespace System.Threading.Tasks
                {
                        var ourTasks = (Task[])tasks.Clone ();
                        AtomicBoolean trigger = new AtomicBoolean ();
-                       Task commonContinuation = new Task (null);
+                       var commonContinuation = new TaskCompletionSource<object> ();
+                       Action<Task> continuationFunc = t => commonContinuation.SetResult (null);
                        
                        foreach (Task t in ourTasks) {
                                Task cont = new Task ((o) => continuationAction ((Task)o), t, cancellationToken, creationOptions, t);
                                t.ContinueWithCore (cont, continuationOptions, scheduler, trigger.TrySet);
-                               cont.ContinueWithCore (commonContinuation, TaskContinuationOptions.None, scheduler);
+                               cont.ContinueWith (continuationFunc);
                        }
                        
-                       return commonContinuation;
+                       return commonContinuation.Task;
                }
                
                public Task ContinueWhenAny<TAntecedentResult> (Task<TAntecedentResult>[] tasks,