不要等待异步方法,但是VS会发出警告

时间:2019-11-12 08:52:59

标签: c# asynchronous async-await

我正在开发WebAPI,其中一个WebApi操作方法调用了另一个我不想等待的具有Async方法的方法。打电话就忘了。

public async Task<IHttpActionResult> Convert(....)
{
//......
//VS warning here
 _asyncJobService.SendWebHook();
//......
}

    public async Task<HttpResponseMessage> SendWebHook()
    {
      //Send and forget, don't wait for result
      return await httpClient.GetAsync("http://stackoverflow.com");
    }

我从VS得到的警告是

  

警告CS4014由于未等待此调用,因此将执行   当前方法在调用完成之前会继续。考虑   将'await'运算符应用于调用结果。

在没有VS警告的情况下连接所有内容的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

首先,您不需要async中的awaitSendWebHook(),除非您打算在等待GetAsync之后执行某些操作。不过,在这种情况下,您只需返回即可。

asyncawait不会使任何事情异步运行,它们有助于等待已经运行的操作。

async is just a keyword that tells the compiler the method is going to use await . In response, the compiler generates a state machine similar to the one used for iterator methods. await`依次等待已经执行异步操作,它本身不会使任何内容异步运行。

在这种情况下,HttpClient.GetAsync是一个异步网络操作,无论是否等待其结果都将运行。

您可以将该方法简化为:

public Task<HttpResponseMessage> SendWebHook()=>httpClient.GetAsync("http://stackoverflow.com");

关于警告,您可以将返回的任务分配给变量或使用_丢弃它:

_ =SendWebHook();

这告诉编译器您真的不想对该任务做任何事情

但是

您确定要执行此操作,尤其是通过 GET 请求执行此操作吗?您不在乎该请求返回什么?即使是运行状况检查ping,您也可能注意监视服务器是否已关闭或超时