1

TaskとCTPを使用して非同期メソッドを実装し、新しいTAPパターンでプローブを実行しています。

私は次のコードを持っています:

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;
}

2番

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;
            });
}

第3

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

4番目のプライベートタスクmethod01Async(){return TaskEx.Run(slowMethod); }

フィス

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

私の結果は、実装1と4で22秒近くかかるということです。その間に終了するには、他の2つは5秒かかります。なぜこの違いが存在するのですか?実装1と4では、ループと同じコードで補助メソッドのみを使用します。

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

Task.FactoryまたはTaskEx.Runの使用の違いはどれですか?

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

4

2 に答える 2

2

メソッドを実行する順序も重要です。それらを2回実行し、2回目の実行のみを実行してみてください。とにかく、2つの違いについて読みたい場合は、ここに最高の記事があります:http: //blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

于 2012-04-26T20:10:52.583 に答える
2

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

ループとカウンターを使用しているだけのときに、実行すべき作業があるとコンパイラーを「だまして」考えさせようとすると、一貫性のない動作が発生する可能性があります。

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

全体として、現実の世界で長時間実行されるプロセスを呼び出す方法を少し変更しても、パフォーマンスに大きな影響はないと想定してください。

于 2012-04-26T20:32:36.277 に答える