我有以下方法:
async Task A()
{
HttpClient client = new HttpClient();
string response = await client.GetStringAsync("http://msdn.microsoft.com");
}
async Task B()
{
HttpClient client = new HttpClient();
string response = await client.GetStringAsync("http://google.com");
}
即调用远程api,对响应进行处理,而不返回任何内容。
我将根据一种常见的方法这样称呼它:
protected void Page_Load(object sender, EventArgs e)
{
A();
B();
// Do further task after this which is not dependent on response of A or B
}
编译器对A和B方法发出以下警告:
由于没有等待此调用,因此在调用完成之前,将继续执行当前方法。考虑将“等待”操作符应用于呼叫的结果。
我不需要从A或B方法返回任何响应,所以我想在A()和B()前面省略“等待”关键字,因为我想在A和B调用之后执行代码"//在此之后执行进一步的任务,这不依赖于A或B的响应“而不需要等待A或B的响应。
我可以忽略编译器警告吗?
我是不是误用了API?
我不能在A和B方法上删除异步操作符,因为HttpClient.GetStringAsync需要它。
编辑
并发现以下评论:
“当您不等待异步方法时,这相当于调用Task.Run(()=>A())。”
是真正的吗?
发布于 2017-03-13 23:13:03
基本上,await
确保Task
完成它的执行。在不使用async
的情况下运行await
方法就像启动Task
而不监视它的进度和结果一样。
例如,在ASP.Net环境中,如果任务从请求线程启动,则会导致任务中止。
发布于 2017-03-13 23:16:24
更新:ASP.NET中的火与忘
在您的代码中,在这之后执行进一步的任务,这不依赖于A或B部件的响应,而是在方法A
和B
完成之前执行(除非这些非常快)。
当您使用await
并且该方法击中该行时,它将向调用方返回一个Task
,调用方继续执行第二行(在您的情况下是B
),因为B
执行相同的操作,那么调用这两个方法后的部分执行。
侧-注:
每个使用await
关键字的方法都应该标记为异步,这是为了进行向后的可比性。但是,编译器只是警告您在调用者中没有等待结果,对于初学者来说,这在很多情况下都是一个很好的警告。
发布于 2017-03-13 23:21:52
如果A和B的执行与Page_Load流的其余部分是异步的,则不必对它们进行await
。
与这里给出的选项相比,另一个选项是向读取代码的其他人显式地显示您忽略了这个警告,那就是用#实用化禁用它。
#pragma warning disable warning-list
A();
B();
#pragma warning restore warning-list
https://stackoverflow.com/questions/42779714
复制