其他分享
首页 > 其他分享> > 我的异步/等待用法在这里正确吗?

我的异步/等待用法在这里正确吗?

作者:互联网

我正在写一个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