2014-09-04 61 views
4

爲什麼從Web Api方法返回Task<T>的做法不是默認方法,以及在Visual Studio中創建新的Web Api控制器時得到的方法?返回任務的Web Api方法的缺點

這樣做有什麼缺點嗎?

public class MyController : ApiController 
{ 
    public Task<string> Boo() 
    { 
     return Task.Factory.StartNew(() => 
     { 
      return "Boo"; 
     }); 
    } 
} 
+0

可能值得注意的是,Task.Factory.StartNew在你想要的意義上並不是真正的異步(即釋放線程)。它只是在後臺線程上運行,所以沒有實際的好處,它只是增加了開銷。如果你總是返回任務,你可以使用Task.FromResult,這會讓你的方法完全同步。然後,你需要問自己爲什麼你打算讓它更加冗長和不太清楚。 – Frans 2014-09-11 20:34:50

回答

2

當使用異步操作:

  • 您的應用程序必須從外部來源(外部服務,數據庫,..)查詢數據。 TaskTask使用異步操作是這種情況是可伸縮應用程序的關鍵,因爲您的線程不會阻止等待外部源。
  • 你需要做很多計算綁定操作。由於計算綁定操作發生在CPU上,因此並行化這些操作可以大大提高應用程序的吞吐量,特別是當您的應用程序在多核計算機上運行時。

有了這樣說,我們並不總是使用異步:http://msdn.microsoft.com/en-us/magazine/hh456402.aspx

一個典型的例子是,我們並不需要查詢從外部數據源的數據,它已經存在:

它實際上可以使開發人員受益,從而避免在特定的一小組用例中使用 異步方法,特別是對於將以更細粒度方式訪問的庫方法。 通常情況下,當知道該方法可能實際上能夠同步完成時,由於所依賴的數據是 已經可用

Task異步操作確實有開銷:

在設計異步方法,框架開發人員花了 很多時間優化掉的對象分配。這是因爲 分配表示異步方法基礎結構中 可能發生的最大性能成本之一。分配 對象的行爲通常非常便宜。分配物品類似於用商品填充您的購物車的 ,因爲它不會花費太多的努力將物品放入購物車;這是當你實際檢查出 ,你需要拉出你的錢包和投資重要的 資源。 雖然分配通常很便宜,但當涉及到應用程序的 性能時,產生的垃圾收集可能是一個炫目。

3

這樣做有什麼不利嗎?

是的,你讓你的代碼不易讀,性能越來越差,沒有很好的理由。我沒有看到的優勢這樣做。