1
我有一個web api調用,我想獲得巨大的吞吐量,所以我用一個任務包裝I/O,希望使其異步。但是,我不確定它確實希望我尋找。C#封裝io與任務,使異步
public HttpResponseMessage Post([FromBody]DataRequest request)
{
Task.Factory.StartNew(() =>
{
service.SendRequestToQueue(request);
});
return Request.CreateResponse(HttpStatusCode.Accepted);
}
我覺得這不是正確的做法。它確實使I/O脫離了請求線程,但仍由應用程序中的線程處理,而不是由內核處理。我對嗎?有沒有更好的方法來做到這一點,然後做出異步並一直等待?
不是。您通常應該完全同步,或完全異步。異步異步(這是什麼)或通過異步同步(異步操作同步阻塞)都是非常有問題的,應該儘可能避免成本。 – Servy
究竟是什麼原因呢?它看起來像客戶只是發送請求,而不是等待結果?如果是這種情況,那麼這是一種很好的方法。 我不確定爲什麼塞維認爲你應該不惜一切代價避免異步方法。這似乎不是一個合理的話。顯然,如果你要開始異步工作,你將會公開一組新的prooblems,但是異步等待可用是有原因的。如果你的意圖是擊中它並忘記它,那麼這是一個很好的解決方案。但是如果你需要等待一個結果。只需使用異步等待。 – Callan
@Callan:這不是一個好的解決方案; [這是非常危險的](http://blog.stephencleary.com/2012/12/returning-early-from-aspnet-requests.html),正如我在我的博客上解釋的。 –