C# ';布尔';不包含';GetWaiter';

C# ';布尔';不包含';GetWaiter';,c#,async-await,C#,Async Await,在尝试检查异步方法的结果时,我得到以下错误 我既没有尝试await container.ExistsAsync().Result也没有尝试bool Result=await container.GetAwaiter().GetResult()工作 我哪里做错了 [TestMethod] public async Task StorageAccountConnectionTest() { var storageCredentials = new StorageCredentials(_mo

在尝试检查异步方法的结果时,我得到以下错误

我既没有尝试
await container.ExistsAsync().Result
也没有尝试
bool 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);
}

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

bool result = await container.GetAwaiter().GetResult().Result;
这是多余的,但也是一个等待发生的死锁问题。(几乎从不直接调用
.Result
。)相反,
等待产生结果的任务:

bool result = await container.GetAwaiter().GetResult();
Edit:正如下面的评论所指出的,我没有注意到
容器已经是一项任务了。由于整个方法已经是
async
,您可以跳过所有
GetAwaiter
内容,直接等待它:

bool result = await container;
编辑:如评论中进一步指出的,您提供的代码似乎与屏幕截图中实际使用的代码不匹配。
容器
本身不是任务,但有一个方法返回您想要的任务:

bool result = await container.ExistsAsync();

该方法已经是异步的-根本不需要使用.GetAwaiter.GetResult()。它可以只是等待。或者她可以只是等待任务:
bool result=await container
@David,你能指出哪里可以阅读关于
GetAwaiter().GetResult()的内容吗而不是
结果
?来自
TaskAwaiter.GetResult
的MS帮助:此API支持产品基础结构,不打算直接从代码中使用。仅供参考,代码应为
wait container.ExistsAsync()。示例代码都是乱七八糟的,但附带的屏幕截图显示了返回
Task
@maccettura:的相应方法调用,现在应该修复了。看起来是这样一个很好的例子:OP在发布代码时人为地修改了代码,而不仅仅是复制/粘贴。谢谢你抓住它!
wait
异步地等待结果,或者
getwaiter().GetResult()
同步地等待结果——不是两者都是。(在这种情况下,似乎根本没有理由去同步。)您不能
等待任务。结果
,您只需使用
等待任务
,所以使用
bool Result=wait container.ExistsAsync()错误的重复链接。这并不是说任务没有GetAwaiter,而是像问题所说的那样,关于
bool
没有GetAwaiter,这是因为这是一个同步和异步代码的大杂烩
ExistsAsync().Result
将强制立即执行一个块,并等待结果可用,同时可能发生死锁。这里不需要
wait
,或者更确切地说,这里不应该调用
Result
,而是应该等待来自
ExistsAsync()
的任务来获得布尔结果。复制品是关于完全不同的东西。