2014-01-21 79 views
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脫離了請求線程,但仍由應用程序中的線程處理,而不是由內核處理。我對嗎?有沒有更好的方法來做到這一點,然後做出異步並一直等待?

+2

不是。您通常應該完全同步,或完全異步。異步異步(這是什麼)或通過異步同步(異步操作同步阻塞)都是非常有問題的,應該儘可能避免成本。 – Servy

+0

究竟是什麼原因呢?它看起來像客戶只是發送請求,而不是等待結果?如果是這種情況,那麼這是一種很好的方法。 我不確定爲什麼塞維認爲你應該不惜一切代價避免異步方法。這似乎不是一個合理的話。顯然,如果你要開始異步工作,你將會公開一組新的prooblems,但是異步等待可用是有原因的。如果你的意圖是擊中它並忘記它,那麼這是一個很好的解決方案。但是如果你需要等待一個結果。只需使用異步等待。 – Callan

+0

@Callan:這不是一個好的解決方案; [這是非常危險的](http://blog.stephencleary.com/2012/12/returning-early-from-aspnet-requests.html),正如我在我的博客上解釋的。 –

回答

1

正如@Servy所評論的,正確的解決方案是一直使用async。特別是在ASP.NET上,您應該避免使用Task.RunTask.Factory.StartNew。如您所懷疑的,使用await以及排隊等待線程池的任務不會給您帶來任何可伸縮性優勢。

您當前的代碼將返回響應,同時繼續處理內存中的請求。這是非常危險的,因爲我解釋了on my blogin a recent CodeMash talk(參見題爲「早期迴歸」的「Gotchas」部分下的幻燈片)。