我正在写一个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
是一个“一劳永逸”的操作,我不关心任何返回值,我只是想尽快回去听新请求。
我应该忽略这个警告,还是我错过了什么?
答案 0 :(得分:3)
好吧,首先我使用Task.Run
代替Task.Factory.StartNew
,只是为了简单起见:)
接下来的事情是考虑坚持这些任务不要立即等待它们,但这样你就可以知道他们什么时候都完成了以便允许正常关闭。
基本上,如果你保留一份“当前正在执行的任务”的列表(当然,确保你自己清理完毕),你可以有一个“退出”机制,例如,所有现有请求允许10秒在关闭过程之前完成。另一件需要考虑的事情是为每个任务添加错误延续,以便您可以干净地记录故障。
您可能仍然会收到类似的警告,但只要您考虑正在生成的任务,就可以抑制或忽略警告。 (所以想一想,但不一定会改变任何东西。)