【问题标题】:How to await a Task<T>(async () => ... )如何等待 Task<T>(async () => ... )
【发布时间】:2018-04-30 05:28:14
【问题描述】:

我正在尝试执行 4 个异步任务,例如

---- Task 1 -------------------
---- Task 2 -------------------
---- Task 3 ----- Task 4 ------

(x轴是时间)

我有

Task<T1> doT1 = ...
Task<T2> doT2 = ...

我需要一个包装器任务doT3T4 依次执行 3 和 4,比如

T3 t3result = await ...
return await SomethingThatUsesT3ResultAsync(t3result);

这样我就可以了

await Task.WhenAll(doT1, doT2, doT3T4);

我试过了

var doT3T4 = new Task<T4>(async () => {
  T3 t3result = await ...
  return await SomethingThatUsesT3ResultAsync(t3result);
});

但这给了我错误

无法将异步 lambda 表达式转换为 ...

【问题讨论】:

  • 你想要的不是 .ContinueWith()
  • 为什么需要包装任务? T3 t3result = await ...; var doT3T4 = SomethingUsesT3ResultAsync(t3result); await Task.WhenAll(doT1, doT2, doT3T4); 具有相同的语义。
  • 正如@pm_2 提到的,看看docs.microsoft.com/en-us/dotnet/api/…
  • 您在哪里看到直接实例化 Task 是一种很好的做法,或者甚至应该这样做?

标签: c# .net asynchronous async-await


【解决方案1】:

将任务 3 和 4 放入方法中

public async Task RunTask3And4()
{
    var result3 = await RunTask3();
    await RunTask4(result3);
}

然后与其他任务一起使用

var tasks = new[]
{
    RunTask1(),
    RunTask2(),
    RunTask3And4()
};
await Task.WhenAll(tasks);

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    相关资源
    最近更新 更多