我正在开发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警告的情况下连接所有内容的正确方法是什么?
答案 0 :(得分:4)
首先,您不需要async
中的await
和SendWebHook()
,除非您打算在等待GetAsync之后执行某些操作。不过,在这种情况下,您只需返回即可。
async
和await
不会使任何事情异步运行,它们有助于等待已经运行的操作。
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,您也可能注意监视服务器是否已关闭或超时