2012-04-26 22 views
1

タスクとCTPを使用して非同期メソッドを実装する新しいTAPパターンでプローブを実行しています。タスクと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は、およそ10mlの液体フッ化水素を圧入くれ22Sを取るということです。一方、他の2人は5秒かかる。なぜこの違いが存在するのですか?実装1と4では、ループと同じコードを持つ補助メソッドのみを使用します。

私は、タスクのコンストラクタのパラメータとしてslowMethod()を使用すると、非常に遅く、TaskExまたはタスクファクトリでデリゲートを使用する場合、ファクトリが高速であることに気付きました。なぜこれが起こるのですか?違いは何ですか?

Task.FactoryまたはTaskEx.Runを使用した場合の違いは何ですか?

TAPパターンのタスクで非同期を使用するベストプラクティスは何ですか?

答えて

2

パフォーマンステストは難題です。

ループとカウンタだけを使用しているときに実行する作業があると思うようにコンパイラを「トリック」しようとすると、不整合な動作が発生する可能性があります。

これは、タイミングの前にウォームアップがないことに言及する前です。これは、デバッグモードがオンのときに行われる可能性が高く、タイミングコード自体は表示されません。すべてのすべてで

- あなたは現実の世界に長い実行中のプロセスを呼び出す方法を書く方法で、若干の変更がが著しくパフォーマンスに影響を与えないことを前提としています。

関連する問題