【问题标题】:'bool' does not contain a definition for 'GetAwaiter'“布尔”不包含“GetAwaiter”的定义
【发布时间】:2020-03-02 14:09:10
【问题描述】:

在尝试检查异步方法的结果时,出现以下错误。

await container.ExistsAsync().Resultbool result = await container.GetAwaiter().GetResult(); 都没有尝试过。

我哪里错了?

[TestMethod]
public async Task StorageAccountConnectionTest()
{
    var storageCredentials = new StorageCredentials(_mockFuncXTransConfiguration.Object.StorageAccountName, _mockFuncXransConfiguration.Object.StorageAccountKey);
    var cloudStorageAccount = new CloudStorageAccount(storageCredentials, true);
    var cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
    var container = cloudBlobClient.GetContainerReference(_mockFuncXTransConfiguration.Object.BlobName);
    bool result = await container.ExistsAsync().Result;
    Assert.AreEqual(true, result);
}

【问题讨论】:

  • await 异步结果或GetAwaiter().GetResult() 同步结果 - 不是两者。 (在这种情况下,似乎根本没有理由去同步。)
  • 你不能await Task.Result,你就用await Task,所以用bool result = await container.ExistsAsync();
  • 错误的重复链接。这与 Task 没有 GetAwaiter 无关,正如问题所述,bool 没有 GetAwaiter,这是因为这是同步和异步代码的大杂烩。 ExistsAsync().Result 将强制立即阻塞并等待结果可用,所有可能发生死锁。 await 这里没有需要,或者更确切地说,这里不应该调用Result,而是应该等待来自ExistsAsync() 的任务来获得布尔结果。副本是关于完全不同的东西。

标签: c# async-await


【解决方案1】:

您当前正在尝试等待任务的结果:

bool result = await container.GetAwaiter().GetResult().Result;

这是多余的,也是等待发生的死锁问题。 (几乎从不直接调用.Result。)相反,await 是产生结果的任务:

bool result = await container.GetAwaiter().GetResult();

编辑: 正如下面的 cmets 所指出的,我错过了 container 已经是一项任务。由于整个方法已经是async,你可以跳过所有GetAwaiter的东西,直接等待它:

bool result = await container;

编辑: 正如 cmets 中进一步指出的那样,您提供的代码似乎与您在屏幕截图中实际使用的代码不匹配。 container 本身不是任务,但有一个方法可以返回您想要的任务:

bool result = await container.ExistsAsync();

【讨论】:

  • 该方法已经是异步的 - 根本不需要使用 .GetAwaiter.GetResult() 。它可以简单地等待。
  • 或者她可以等待任务:bool result = await container
  • @David,您能否指出应该使用GetAwaiter().GetResult(); 而不是Result 的内容?来自TaskAwaiter.GetResult 的 MS 帮助:此 API 支持产品基础架构,不打算直接从您的代码中使用。
  • 仅供参考,代码应为await container.ExistsAsync();。示例代码全部搞砸了,但包含的屏幕截图显示了返回 Task<bool> 的适当方法调用
  • @maccettura:现在应该修复了。看起来是一个很好的例子,即 OP 在发布代码时人为修改代码,而不仅仅是复制/粘贴。感谢收看!
猜你喜欢
  • 1970-01-01
  • 2012-08-04
  • 2017-04-20
  • 2017-11-20
  • 2018-08-21
  • 2016-12-15
  • 2017-04-08
  • 2023-01-09
  • 2020-08-21
相关资源
最近更新 更多