我在这里使用异步/等待是否正确?

时间:2014-01-28 00:28:46

标签: c# async-await

我正在写一个HTTP服务器。有很多人喜欢它,但这个是我的。它包含以下代码:

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

代码似乎像魅力一样工作。它感觉快速,响应迅速,似乎没有泄漏资源等。但是,我加下划线的行在Visual Studio中发出警告:

  

由于未等待此调用,因此在完成调用之前会继续执行当前方法。考虑将'await'运算符应用于调用的结果。

显然,如果我将await贴在Task.Factory.Startnew()前面,警告就会消失......但在这种情况下这样做真的有意义吗?我希望ProcessRequest是一个“一劳永逸”的操作,我不关心任何返回值,我只是想尽快回去听新请求。

我应该忽略这个警告,还是我错过了什么?

1 个答案:

答案 0 :(得分:3)

好吧,首先我使用Task.Run代替Task.Factory.StartNew,只是为了简单起见:)

接下来的事情是考虑坚持这些任务不要立即等待它们,但这样你就可以知道他们什么时候都完成了以便允许正常关闭。

基本上,如果你保留一份“当前正在执行的任务”的列表(当然,确保你自己清理完毕),你可以有一个“退出”机制,例如,所有现有请求允许10秒在关闭过程之前完成。另一件需要考虑的事情是为每个任务添加错误延续,以便您可以干净地记录故障。

您可能仍然会收到类似的警告,但只要您考虑正在生成的任务,就可以抑制或忽略警告。 (所以想一想,但不一定会改变任何东西。)