我的异步/等待用法在这里正确吗?
作者:互联网
我正在写一个HTTP服务器.有很多类似的东西,但这是我的.它包含以下代码:
private async void Listen(object state)
{
while (webListener.IsListening)
{
HttpListenerContext context = await webListener.GetContextAsync();
Task.Factory.StartNew(() => ProcessRequest(context));
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
}
该代码似乎像一个魅力.感觉很快,响应迅速,似乎没有泄漏资源,等等.但是,我强调的这一行在Visual Studio中给出了警告:
Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the ‘await’ operator to the result of the call.
显然,如果我在Task.Factory.Startnew()前面等待,警告就会消失,但是在这种情况下这样做真的有意义吗?我希望ProcessRequest是一个“即发即弃”的操作,我不在乎任何返回值,我只想尽快回到监听新请求的位置.
我应该忽略该警告,还是我错过了什么?
解决方法:
好吧,首先,为了简单起见,我将使用Task.Run代替Task.Factory.StartNew :)
接下来的事情是考虑保留这些任务,不要立即等待它们,而是让您知道它们何时全部完成,以便允许正常关机.
基本上,如果您保留“当前正在执行的任务”列表(当然,请确保在执行过程中清理工作),则可以使用“退出”机制,例如,所有现有请求在完成之前需要10秒才能完成关闭进程.要考虑的另一件事是向每个任务添加错误的继续,以便您可以清晰地记录故障.
您可能仍然会收到类似的警告,但是只要您考虑正在生成的任务,就可以取消或忽略该警告. (因此,请考虑一下,但不必做任何更改.)
标签:async-await,c 来源: https://codeday.me/bug/20191122/2057785.html