浏览代码

Fixed TaskFactory::ContinueWhenAny with func result. Fixes #14839

Marek Safar 12 年之前
父节点
当前提交
ee5939881d

+ 5 - 7
mcs/class/corlib/System.Threading.Tasks/TaskActionInvoker.cs

@@ -290,12 +290,10 @@ namespace System.Threading.Tasks
 		sealed class FuncTaskSelected<TResult> : TaskActionInvoker
 		{
 			readonly Func<Task, TResult> action;
-			readonly Task[] tasks;
 
-			public FuncTaskSelected (Func<Task, TResult> action, Task[] tasks)
+			public FuncTaskSelected (Func<Task, TResult> action)
 			{
 				this.action = action;
-				this.tasks = tasks;
 			}
 
 			public override Delegate Action {
@@ -306,8 +304,8 @@ namespace System.Threading.Tasks
 
 			public override void Invoke (Task owner, object state, Task context)
 			{
-				var result = ((Task<int>) owner).Result;
-				((Task<TResult>) context).Result = action (tasks[result]);
+				var result = ((Task<Task>) owner).Result;
+				((Task<TResult>) context).Result = action (result);
 			}
 		}
 
@@ -492,9 +490,9 @@ namespace System.Threading.Tasks
 			return new ActionTaskSelected (action);
 		}
 
-		public static TaskActionInvoker Create<TResult> (Func<Task, TResult> action, Task[] tasks)
+		public static TaskActionInvoker CreateSelected<TResult> (Func<Task, TResult> action)
 		{
-			return new FuncTaskSelected<TResult> (action, tasks);
+			return new FuncTaskSelected<TResult> (action);
 		}
 
 		#endregion

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

@@ -305,7 +305,7 @@ namespace System.Threading.Tasks
 		{
 			CheckContinueArguments (tasks, continuationFunction, continuationOptions, scheduler);
 
-			var cont = Task.WhenAnyCore (tasks).ContinueWith<TResult> (TaskActionInvoker.Create (continuationFunction, tasks), cancellationToken, continuationOptions, scheduler);
+			var cont = Task.WhenAnyCore (tasks).ContinueWith<TResult> (TaskActionInvoker.CreateSelected (continuationFunction), cancellationToken, continuationOptions, scheduler);
 
 			return cont;
 		}

+ 8 - 0
mcs/class/corlib/Test/System.Threading.Tasks/TaskFactoryTest.cs

@@ -281,6 +281,14 @@ namespace MonoTests.System.Threading.Tasks
 			t2.Set ();
 		}
 
+		[Test]
+		public void ContinueWhenAny_WithResult ()
+		{
+			Task[] tasks = new[] { Task.FromResult (1) };
+			var res = Task.Factory.ContinueWhenAny (tasks, l => 4);
+			Assert.AreEqual (4, res.Result);
+		}
+
 		[Test]
 		public void ContinueWhenAny_InvalidArguments ()
 		{