【问题标题】:Awaiting tasks of different types等待不同类型的任务
【发布时间】:2017-10-15 13:21:55
【问题描述】:
IEnumerable<Task<Request>> requestTasks = CreateRequestTasks();
Task<Trace> traceTask = CreateTraceTask();

var tasks = new List<Task>();
tasks.AddRange(requestTasks);
tasks.Add(traceTask);

await Task.WhenAll(tasks);

如何从requestTasks 集合中获取结果?

【问题讨论】:

  • foreach(var meTask in tasks) /*get result/*meTask.Result; ?或者更简单的foreach(Task&lt;Request&gt; meTask in requestTasks) meTask.Result;
  • @m.rogalski Result 是同步阻塞等待。
  • 但是当您等待所有任务时,结果应该立即可用。至少据我所知。
  • @m.rogalski 是的,但async-await 的重点是在等待任务完成时不要阻塞线程。
  • 我不明白你的意思。他在await Task.WhenAll(tasks); 等待这些任务,所以在这些任务完成后,他可以使用foreach 来检索结果(之前在任务中完成)。或者也许我在这里遗漏了一些东西。

标签: c# async-await


【解决方案1】:

由于你必须等待它们,你可以简单地写

IEnumerable<Task<Request>> requestTasks = CreateRequestTasks();
Task<Trace> traceTask = CreateTraceTask();

var tasks = await Task.WhenAll(requestTasks);
var trace = await traceTask;

在等效的 async 块内:恕我直言,它可能看起来更清晰。

还要注意,上面的traceTask 从创建开始(实际上这是same answer,因为问题本身是重复的)。

【讨论】:

    【解决方案2】:

    如何从 requestTasks 集合中获取结果?

    将其作为一个单独的(具体化的)集合保存:

    List<Task<Request>> requestTasks = CreateRequestTasks().ToList();
    ...
    await Task.WhenAll(tasks);
    var results = await Task.WhenAll(requestTasks);
    

    请注意,第二个await Task.WhenAll 实际上不会执行任何“异步等待”,因为所有这些任务都已完成。

    【讨论】:

    • 我认为第二次等待可能导致第二次执行任务。感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多