繁体   English   中英

将异步方法的结果分配给变量

[英]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

让我们举个例子。

  1. 您需要网站的一些计数器数据作为您的方法(例如, public async Task<int> GetCounter()

这里的GetCounter是一个异步方法,但是您应该先等待它,然后再继续。 因此,等待着。

  1. 现在,您不想将+1计数器推送到同一网站,而又不想知道当时网站是否收到,您可以忽略等待。

如果要调用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的帖子里介绍了如何使用工作的asyncawait ,为什么你应该避免async void 简而言之:仅对事件使用async void ,并且当您调用async方法时,其中的所有内容都必须至少返回Task

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM