c#一个问题的代码

static void Main()
        {
            Task t = new Task(() =>
              {
                  CancellationTokenSource cts = new CancellationTokenSource();
                  TaskFactory<int> tf = new TaskFactory<int>(cts.Token, TaskCreationOptions.AttachedToParent,
                      TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);

                  Task<int>[] Task1 = new[]
                  {
                     tf.StartNew(()=>10),
                     tf.StartNew(()=>100),
                     tf.StartNew(()=>1000)
                 };

                  for (int i = 0; i < Task1.Length; ++i)
                  {
                      Task1[i].ContinueWith(task=>cts.Cancel(),TaskContinuationOptions.OnlyOnFaulted);
                  }

                  tf.ContinueWhenAll(Task1, Comp => Comp.Where(tc => !tc.IsFaulted && !tc.IsCanceled).Max(tz => { return tz.Result; }),
                       CancellationToken.None).ContinueWith(p => Console.WriteLine("最大值"+p.Result.ToString()), TaskContinuationOptions.ExecuteSynchronously);        
              });
              
            t.Start();
            Console.ReadLine();

问题: tf.ContinueWhenAll创建的延续任务,为什么使用的task是数组的中一个?

阅读 1.5k
1 个回答
为什么使用的task是数组的中一个

所以问题到底是啥……这也读不通啊……


补充回答:

这问题,只能靠猜。你是不理解 ContinueWhenAll 的用法吗?

TaskFactory<T>.ContinueWhenAll(
    Task<T>[], // 一组任务
    Function<Task<T>[], T>, // 一个回调函数
    CancellationToken
); // 一组任务都执行完后,把这组任务传到一个回调函数里,最后返回其中一个任务

可以近似理解为:

Task<T> Callback(Task<T> tasks)
{
    // dosomthing
    return default(Task<T>);
    // 根据一定条件返回其中任务,像你的代码里就是选了一个结果最大的任务返回的;当然,你也可以完全忽略传进来的参数,返回一个全新的任务,只要 T 是相同类型的就可以
} // 有个回调函数

Task<T>[] tasks; // 有一组任务
Task.WhenAll(tasks).Wait(); // 等它们都执行完
Task<T> task = Callback(tasks); // 把它当参数传进回调函数里
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进