[英]Assigning result of async method to a variable
我正在看这种情况下的“好”示例,特别是将异步方法的结果分配给变量。 (在这种情况下,这是一个废弃变量,但是如果我只是执行var x =
它的工作原理相同)。
public void Heartbeat(object state)
{
// Discard the result
_ = DoAsyncPing();
}
private async Task DoAsyncPing()
{
await _client.GetAsync("http://mybackend/api/ping");
}
在我自己尝试此操作时,我注意到如果删除_
变量,则会收到编译器警告,提示“未等待此调用”。 为什么分配结果与方法的调用方式有所不同? 某个地方有隐式await
吗?
使用_
关键字, DoAsyncPing()
Task
作为DoAsyncPing()
的输出分配给_
。 在那种情况下,没有执行,而仅仅是一个任务。
如果不使用_
=,则会调用该函数,并且编译器会警告您未等待该调用。 所以第一种方法是赋值,第二种是执行
关于您的代码, _
包含Task。
如果不等待,则无论异步方法的完成状态如何,现有方法都将继续执行
如果需要在继续当前方法之前等待一些异步操作完成,则应await
让我们举个例子。
public async Task<int> GetCounter()
) 这里的GetCounter是一个异步方法,但是您应该先等待它,然后再继续。 因此,等待着。
如果要调用Async
方法,则必须返回Task
而不是void
。
由于您尝试从Heartbeat
调用DoAsyncPing()
:
1.-将void Heartbeat(object state)
转换为async Task HeartbeatAsync(object state)
。
添加async
语句将使您可以在其中await
。
按照惯例 ,您可能需要调用awaitable/async
方法MethodNameAsync()
。
2.-满足了之前的要求,您现在可以调用DoAsyncPing()
(我建议通过以下方式将其重命名为DoPingAsync()
:
public async Task Heartbeat(object state)
{
// Discard the result
_ = await DoAsyncPing();
}
给一个尝试这种斯蒂芬Cleary的帖子里介绍了如何使用工作的async
和await
,为什么你应该避免async void
。 简而言之:仅对事件使用async void
,并且当您调用async
方法时,其中的所有内容都必须至少返回Task
。
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.