4

だから私は、いくつかのデバイスにいくつかの IO を行う「保存」メソッドをサポートするビジネス オブジェクトを持っています。次に、バッチで非同期に保存するオブジェクトのリストを取得します。私のコードは次のようになります。

    public async Task Save()
    {
        foreach (var element in Elements)
        {
            await element.Save();
        }
    }    

これによりn、待機の数が発生し、待機ごとにCPUオーバーヘッドが少し発生することがわかります。私はこれを排除し、1 つのみを待ちたいと思っています。これを達成するにはどうすればリファクタリングできますか?

4

1 に答える 1

13

まあ、あなたはSave()すべてを呼び出してから、それらすべてが終了するのを待つことができますTask.WhenAll:

public async Task Save()
{
    await Task.WhenAll(Elements.Select(x => x.Save());
} 

または、他に何もしない場合は、次のようにします。

public Task Save()
{
    return Task.WhenAll(Elements.Select(x => x.Save());
} 

編集:それらを連続して実行したい場合は、既に取得したコードを使用してください。async/await が設計され、実際に同期的に完了する呼び出し (たとえば、キャッシュ ヒット、またはあなたの場合はダーティ チェック) を待機する方法が非常に安価であることは注目に値します。タスクのスケジューリングや継続の作成などは必要ありません。あなたは言う:

10000 個のオブジェクトのリストがあり、そのうちの 1 つだけがダーティである場合、9999 個の不要な async-await が発生することになり、これは重要であると思われます。

いつものように、パフォーマンスのボトルネックに関する疑いはほとんど無意味です。重要なのは、パフォーマンスのボトルネックに関する証拠です。既存のコードを試してコストを測定しましたか? そうでない場合は、何かを変更する前にそれを行うことを強くお勧めします。

于 2012-07-09T14:32:01.943 に答える