Ver Fonte

Use a TaskCompletionSource in non-generic ContinueWhenAny case. Fix #647.

Jérémie Laval há 14 anos atrás
pai
commit
48a5bbeb93
1 ficheiros alterados com 4 adições e 3 exclusões
  1. 4 3
      mcs/class/corlib/System.Threading.Tasks/TaskFactory.cs

+ 4 - 3
mcs/class/corlib/System.Threading.Tasks/TaskFactory.cs

@@ -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,