2012-04-26 98 views
1

我正在使用新的TAP模式進行探測,使用Task和CTP來實現異步方法。任務和TAP異步模式:差異bwteewn factory.StartNew和TaskEx.Run

我有以下代碼:

private async void btnAsync01_Click(object sender, RoutedEventArgs e) 
     { 
      UpdateTxtLog("Enter in button Async01: " + System.DateTime.Now); 
      double result = await method01Async(); 
      UpdateTxtLog("exit in button Async01: " + System.DateTime.Now); 
      UpdateTxtLog("result: " + result.ToString()); 
     } 

那是讓我測試異步方法GUI的按鈕。

我可以有method01Aync的以下實現。

第一:

private async Task<double> method01Async() 
     { 
       return await Task.Factory.StartNew<double>(slowMethod); 
     } 


private double slowMethod() 
{ 
      double doubleDummy = 0; 
      for (double i = 0; i < 1000000000; i++) 
      { 
       doubleDummy++; 
      } 
      return doubleDummy; 
} 

private Task<double> method01Aync() 
{ 
return Task.Factory.StartNew<double>(() => 
      { 
       //O métodos auxiliares lentos... etc. 
       double doubleDummy = 0; 
       for (double i = 0; i < 1000000000; i++) 
       { 
        doubleDummy++; 
       } 
       return doubleDummy; 
      }); 
} 

private Task<double> method01Aync() 
{ 
      return TaskEx.Run<double>(() => 
      { 
       double doubleDummy = 0; 
       for (double i = 0; i < 1000000000; i++) 
       { 
        doubleDummy++; 
       } 
       return doubleDummy; 
      }); 
} 

四 私人任務method01Async(){ 回報 TaskEx.Run(slowMethod); }

FITH

private Task<double> method01Async 
{ 
return TaskEx.Run<double>(() => 
      { 
       return metodoLento(); 
      }); 
} 

我的結果是:實施1和4把我22S aprox的。同時另外兩個需要5秒。爲什麼存在這種差異?在實現1和4中,只使用循環中具有相同代碼的輔助方法。

我已經注意到,如果我使用slowMethod()作爲Task的構造函數的參數非常慢,並且如果我在TaskEx中使用委託或者在任務Factory中速度很快。爲什麼會發生這種情況?有哪些不同?

這是使用Task.Factory或TaskEx.Run的區別嗎?

什麼是與TAP模式的任務使用異步的最佳做法?

回答

2

性能測試是一個棘手的問題。

試圖「欺騙」編譯器,認爲只有在使用循環和計數器時可能會導致不一致的行爲。

這是之前提到的一個事實,即在定時之前沒有預熱,這可能是在調試模式打開的情況下完成的,並且定時代碼本身未顯示。

所有的一切 - 承擔你寫你怎麼稱呼一個長期運行的進程在現實世界中不會實質性影響你的表現的方式,小的改動。