我正在看this scenario中的“好”示例,专门将异步方法的结果分配给变量。 (在这种情况下,它是discard variable,但如果我只是var x =
,它的工作原理也一样。)
public void Heartbeat(object state)
{
// Discard the result
_ = DoAsyncPing();
}
private async Task DoAsyncPing()
{
await _client.GetAsync("http://mybackend/api/ping");
}
我自己尝试进行此操作时,发现如果删除_
变量,则会收到编译器警告,提示“未等待此调用”。为什么分配结果与方法的调用方式有所不同?某个地方有隐式await
吗?
答案 0 :(得分:1)
使用_
关键字将DoAsyncPing()
的输出作为_
分配给Task
。在那种情况下,没有执行,而仅仅是一个任务。
在没有_
=的情况下,将调用该函数,并且编译器将警告您未等待该调用。所以第一种方法是赋值,第二种方法是执行
答案 1 :(得分:1)
关于您的代码,_
包含任务。
如果您不等待,则无论异步方法的完成状态如何,现有方法将继续执行
如果在继续当前方法之前需要等待一些异步操作完成,则应放置await
举个例子。
public async Task<int> GetCounter()
)这里GetCounter是一个异步方法,但是您应该先等待它,然后再继续。因此等待。
答案 2 :(得分:1)
如果要调用Async
方法,则必须返回Task
而不是void
。
由于您正尝试从DoAsyncPing()
呼叫Heartbeat
:
1。-将void Heartbeat(object state)
转换为async Task HeartbeatAsync(object state)
。
添加async
语句将使您可以在其中await
。
Convention说您可能需要调用awaitable/async
方法
MethodNameAsync()
。
2.-满足了之前的要求,您现在可以调用DoAsyncPing()
(我建议将其重命名为DoPingAsync()
:
public async Task Heartbeat(object state)
{
// Discard the result
_ = await DoAsyncPing();
}
尝试尝试this Stephen的Cleary帖子,其中解释了如何使用async
和await
以及为什么应该避免使用async void
。简而言之:只需在事件上使用async void
,并在调用async
方法时,其中的所有内容都必须至少返回Task
。
希望有帮助。