【问题标题】:Can't method chain with async/await无法使用 async/await 进行方法链
【发布时间】:2018-08-10 00:26:36
【问题描述】:

我有一个在 .NET 4.6.1 上运行的 ASP.NET 应用程序。

我无法在等待的GetInts() 结果中使用.Sum()。编译器认为GetInts() 是一个任务。 SumIntsOneLinerBroker() 无法编译。

public Task<List<int>> GetInts() {
    var list = new List<int> { 4, 5 };

    return Task.FromResult(list);
}

public async Task<int> SumInts() {
    var ints = await GetInts();
    return ints.Sum();
}

public async Task<int> SumIntsOneLinerBroker() {
    return await GetInts().Sum();
}

public async Task<int> SumIntsOneLinerWorking() {
    return (await GetInts()).Sum();
}

【问题讨论】:

  • 括号是一直以来的工作方式
  • 我相信你的话,谢谢。将此标记为已关闭。
  • 不要张贴代码作为屏幕截图。请简单地复制并粘贴它。这样搜索引擎可以索引你的帖子,其他人可以通过搜索找到它,人们可以复制和粘贴代码,它使用更少的流量,列表还在继续。谢谢!
  • @DJKempner - 请不要发布屏幕截图 - 我们需要 minimal reproducible example 以便我们可以运行您的代码并给您一个体面的答案。请将代码以文本形式发布。
  • 如果不使用括号,你的await定义为await (GetInts().Sum()),当然不能编译

标签: c# asp.net .net async-await


【解决方案1】:

有几种方法可以处理这个问题。最常见的可能是您在代码中显示并由 Marc 确认的括号。

另一种选择是.ContinueWith,它允许您将第一个操作的结果传递给第二个操作。这是Microsoft Example。请记住,当您使用 ContinueWith 时,异常将被包裹在 AggregateException 中,这可能会改变您的异常处理。

【讨论】:

    【解决方案2】:

    经 Marc 确认,第二张图片中的括号括起来的方法是正确的方法。这里没什么可看的。

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多