c#async / await適切な構造で複数のメソッドを同時に実行する

ガンダー

数年前、私は初めてasync / awaitを実装することに少し行き詰まりました。[このサイトで]私の質問に対する答えを得て、私は陽気な道を進みました。

しかし、最近、以前に受け取った正確な解決策に非常に近いにもかかわらず、「これらの呼び出しを並行して実行していない」と言われました。

今、私は考え直しています。

これが背景と可能な解決策です。

要点は、メソッド1を実行したくないということです。結果を待ち、次にメソッド2を実行して、それらの結果を待ちます。2つのメソッド呼び出しが互いに関係がない場合、これは遅すぎます。

2つのメソッド呼び出しを実行したいのですが、どちらもデータベースに送信されますが、それは何でもかまいません。両方の呼び出しの結果が得られるまで処理を続行したくありません。

public async Task<DataViewModel> GetDataInParallel()
{
    var asyncStuff = new
    {
        result1 = await _databaseRepo.QuerySomething(),
        result2 = await _databaseRepo.QuerySomethingElse()
    };

    return new DataViewModel(asyncStuff.result1, asyncStuff.result2);
}

vs

public async Task<DataViewModel> GetDataInParallel()
{
    var result1Task = _databaseRepo.QuerySomething();
    var result2Task = _databaseRepo.QuerySomethingElse();

    var asyncStuff = new
    {
        result1 = await result1Task,
        result2 = await result2Task
    };

    return new DataViewModel(asyncStuff.result1, asyncStuff.result2);
}

私は自分のWebサイトで両方のバージョンを使用していますが、オプション1を使用するバージョンが並行して処理を行っていないのではないかと考えており、パフォーマンスが低下しています。

これを証明する方法が正確にはわかりません。2つのメソッド呼び出しを並行して実行する正しいバージョンがどれであるかを誰かが知っていますか?それとも両方とも正しい/間違っていますか?

Pavel Tupitsyn

最初のバージョンは、最初の操作を待ってから2番目の操作を開始するため、並列ではありません。

2番目のバージョンでは、それらを並行して実行します(両方を開始してから、両方を待機します)。あなたはそれを使用することによってそれをより明白にすることができますTask.WhenAll

public async Task<DataViewModel> GetDataInParallel()
{
    var result1Task = _databaseRepo.QuerySomething();
    var result2Task = _databaseRepo.QuerySomethingElse();

    await Task.WhenAll(result1Task, result2Task);

    return new DataViewModel(result1Task.Result, result2Task.Result);
}

なぜWhenAllより良い選択であるかを見てくださいなぜ私は複数のawaitよりも単一の 'await Task.WhenAll'を好むべきですか?

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#asyncとJava ExecutorServiceの違い

分類Dev

C#async / awaitメソッドをF#に?

分類Dev

非同期Foreachループの実行C#async await

分類Dev

Azure MLの例を使用してC#async / await to F#

分類Dev

C#Async Await In WCF4.5および例外処理

分類Dev

C#Async / Awaitは割り込みのように機能しますか?

分類Dev

C#async / await-1つの優先タスクを含む複数のタスク

分類Dev

C#async / awaitコードで「コンテキスト」とは正確にはどういう意味ですか?

分類Dev

C#async / awaitをスタンドアロンCPSトランスフォームとして使用する方法

分類Dev

C#Asyncは、待機せずに呼び出された関数で待機します

分類Dev

C#Async / Wait SmtpClient.SendMailAsync

分類Dev

C ++で構造体をcharの適切なメソッドにマップする方法

分類Dev

C#Async / Awaitアプリケーション内にループサービスを作成するにはどうすればよいですか?

分類Dev

C#async / await-プログラムは「await」が呼び出された場所をどのように追跡しますか?

分類Dev

C# async タスク - メソッドに複数の await() を含めることはできますか

分類Dev

C#Async Await、非常に単純なエクササイズプログラムをリファクタリングしましたが、動作が異なります

分類Dev

複数のブラウザで同時にテストを実行するにはどうすればよいですか?Seleniumグリッド、C#、Specflow、NUnit

分類Dev

asyncメソッドでawaitがすべての実行を終了するのを待つ方法は?

分類Dev

複数のコントロールを実行できますが、C#で同じメソッドを実行できますか

分類Dev

C:同時に実行される2つの異なるプログラム間で構造体のインスタンス化を共有する

分類Dev

c#5.0では、「async / await」関数は実行開始時に常にメインスレッドで実行されますか

分類Dev

構造体のメソッドをC ++で宣言する必要がないのはなぜですか?

分類Dev

asyncでanonymousメソッドを適切に呼び出す

分類Dev

C#で非同期メソッドの実行時間を計算する方法

分類Dev

C#で非同期メソッドの実行時間を計算する方法

分類Dev

同期メソッドが混在している場合に、WebAPIでasync / awaitの利点を実現する

分類Dev

複数のスレッドを同時に使用するc ++

分類Dev

async / await:スレッドを使用しない場合、同時に処理を実行するために何をしていますか?

分類Dev

実行時に適切なメソッドを実行する

Related 関連記事

  1. 1

    C#asyncとJava ExecutorServiceの違い

  2. 2

    C#async / awaitメソッドをF#に?

  3. 3

    非同期Foreachループの実行C#async await

  4. 4

    Azure MLの例を使用してC#async / await to F#

  5. 5

    C#Async Await In WCF4.5および例外処理

  6. 6

    C#Async / Awaitは割り込みのように機能しますか?

  7. 7

    C#async / await-1つの優先タスクを含む複数のタスク

  8. 8

    C#async / awaitコードで「コンテキスト」とは正確にはどういう意味ですか?

  9. 9

    C#async / awaitをスタンドアロンCPSトランスフォームとして使用する方法

  10. 10

    C#Asyncは、待機せずに呼び出された関数で待機します

  11. 11

    C#Async / Wait SmtpClient.SendMailAsync

  12. 12

    C ++で構造体をcharの適切なメソッドにマップする方法

  13. 13

    C#Async / Awaitアプリケーション内にループサービスを作成するにはどうすればよいですか?

  14. 14

    C#async / await-プログラムは「await」が呼び出された場所をどのように追跡しますか?

  15. 15

    C# async タスク - メソッドに複数の await() を含めることはできますか

  16. 16

    C#Async Await、非常に単純なエクササイズプログラムをリファクタリングしましたが、動作が異なります

  17. 17

    複数のブラウザで同時にテストを実行するにはどうすればよいですか?Seleniumグリッド、C#、Specflow、NUnit

  18. 18

    asyncメソッドでawaitがすべての実行を終了するのを待つ方法は?

  19. 19

    複数のコントロールを実行できますが、C#で同じメソッドを実行できますか

  20. 20

    C:同時に実行される2つの異なるプログラム間で構造体のインスタンス化を共有する

  21. 21

    c#5.0では、「async / await」関数は実行開始時に常にメインスレッドで実行されますか

  22. 22

    構造体のメソッドをC ++で宣言する必要がないのはなぜですか?

  23. 23

    asyncでanonymousメソッドを適切に呼び出す

  24. 24

    C#で非同期メソッドの実行時間を計算する方法

  25. 25

    C#で非同期メソッドの実行時間を計算する方法

  26. 26

    同期メソッドが混在している場合に、WebAPIでasync / awaitの利点を実現する

  27. 27

    複数のスレッドを同時に使用するc ++

  28. 28

    async / await:スレッドを使用しない場合、同時に処理を実行するために何をしていますか?

  29. 29

    実行時に適切なメソッドを実行する

ホットタグ

アーカイブ