我有一个web api调用,我希望获得很大的吞吐量,所以我用一个Task包装I / O,希望能使它异步。但是,我不确定它是否真的要我找。
public HttpResponseMessage Post([FromBody]DataRequest request)
{
Task.Factory.StartNew(() =>
{
service.SendRequestToQueue(request);
});
return Request.CreateResponse(HttpStatusCode.Accepted);
}
我觉得这不是正确的方法。它确实从请求线程中获取I / O,但仍然由应用程序中的线程而不是内核处理。我对吗?有没有更好的方法来做到这一点,然后制作异步并等待一直下来?
答案 0 :(得分:1)
正如@Servy评论的那样,正确的解决方案是一直使用async
。特别是在ASP.NET上,您应该避免使用Task.Run
和Task.Factory.StartNew
。正如您所怀疑的那样,将await
与排队到线程池的任务一起使用将不会给您带来任何可伸缩性的好处。
当前的代码会在继续处理内存中的请求时返回响应。这是非常危险的,因为我解释了on my blog和in a recent CodeMash talk(请参阅标题为“早期返回”的“陷阱”部分下的幻灯片。)