这里我的async/await用法正确吗?

3

我正在编写一个HTTP服务器。虽然有很多类似的服务器,但这个是我的。它包含以下代码:

 private async void Listen(object state)
 {
      while (webListener.IsListening)
      {
           HttpListenerContext context = await webListener.GetContextAsync();
           Task.Factory.StartNew(() => ProcessRequest(context));
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      }
 }

代码似乎非常好用。它感觉快速,反应灵敏,不会泄露资源等等。但是,我在Visual Studio中下划线的那一行代码会给出一个警告:
因为这个调用没有被等待,所以当前方法的执行会在调用完成之前继续。请考虑对调用结果应用“await”运算符。
显然,如果我在 Task.Factory.Startnew() 前面添加 await ,警告就会消失……但在这种情况下真的有意义吗?我希望 ProcessRequest 是一个“启动并忘记”的操作,我不关心任何返回值,我只想尽快回到监听新请求的状态。我应该忽略警告,还是我漏掉了什么?

@David Venegoni:这就是OP 不想要 的。 - zerkms
1
我发布了一个简单的TCP服务器的示例。类似的线程和async/await模型也可以应用于基于HttpListener的服务器。 - noseratio - open to work
2
哈。第二句话中有不错的参考。 - Lynn Crumbling
1个回答

3
首先,为了简单起见,我会使用Task.Run代替Task.Factory.StartNew
接下来要考虑的是保留这些任务而不立即等待它们完成,以便您可以知道它们何时全部完成,以允许优雅地关闭。
基本上,如果您保留一个“当前正在执行的任务”列表(当然,在进行过程中一定要清理),则可以有一个“退出”机制,允许在关闭进程之前等待所有现有请求完成10秒钟。另一件要考虑的事情是为每个任务添加错误继续操作,以便您可以干净地记录失败。
您可能仍然会收到类似的警告,但只要您考虑您生成的任务,就可以抑制或忽略该警告。(所以请考虑,但不一定更改任何内容。)

谢谢你确认我没有完全错过重点。另外,我已经采纳了你的建议,简化为只使用 Task.Run - Ryan Ries

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接