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

时间:2018-12-17 10:32:59

标签: c# async-await

我正在看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吗?

3 个答案:

答案 0 :(得分:1)

使用_关键字将DoAsyncPing()的输出作为_分配给Task。在那种情况下,没有执行,而仅仅是一个任务。

在没有_ =的情况下,将调用该函数,并且编译器将警告您未等待该调用。所以第一种方法是赋值,第二种方法是执行

答案 1 :(得分:1)

关于您的代码,_包含任务。

如果您不等待,则无论异步方法的完成状态如何,现有方法将继续执行

如果在继续当前方法之前需要等待一些异步操作完成,则应放置await

举个例子。

  1. 您要从网站获取一些计数器数据作为该方法(例如public async Task<int> GetCounter()

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

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

答案 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帖子,其中解释了如何使用asyncawait以及为什么应该避免使用async void。简而言之:只需在事件上使用async void,并在调用async方法时,其中的所有内容都必须至少返回Task

希望有帮助。