ネストされたTask.WhenAllsと同等のエレガントな方法はありますか?

user7127000

すぐに開始できる他の独立したタスクのコレクションを作成する独立したタスクのコレクションがあるコードをよく使用するため、時間的には次のようになります。

A0 -------
          B0 --------- C0 --------- ...
          B1 ------ C1 ------------ ...
          B2------------------- C2  ...

A1 ---
      B3 -------- C3--------------- ...
      B4  -- C4 ------------------- ...

私がしていることは通常、次のようなネストされたメソッドを持っていることです

.
.
.
await Task.WhenAll(A0, A1)
.
.
.

private static async ExecuteA(Task A)
{
     var results = await A;
     var BsS = results.Select(r => ExecuteBC(r));
     await Task.WhenAll(BCs);

private static async ExecuteBC(string value)
{
     var result = await ExecuteB(value);
     await ExecuteC(result);
}

ネストされた非同期タスクをチェーンするためのよりエレガントな方法はありますか?

謎めき

私はあなたの基本的なサンプルコードを取り、それが結果を生み出すまでそれを具体化しました:

async Task Main()
{
    string[] a0_source = new[] { "Hello", "World" };
    string[] a1_source = new[] { "Hi", "There" };

    Task<string[]> A0 = ExecuteA(a0_source);
    Task<string[]> A1 = ExecuteA(a1_source);

    var results = await Task.WhenAll(A0, A1);

    var output = String.Join(", ", results.SelectMany(x => x));

    Console.WriteLine(output);
}

private static async Task<string[]> ExecuteA(string[] A)
{
    var BCs = A.Select(r => ExecuteBC(r));
    return await Task.WhenAll(BCs);
}

private static async Task<string> ExecuteBC(string value)
{
    var result = await ExecuteB(value);
    return await ExecuteC(result);
}

private static async Task<string> ExecuteC(string value)
{
    return await Task.Run(() => value + "!C");
}

private static async Task<string> ExecuteB(string value)
{
    return await Task.Run(() => value + "!B");
}

これHello!B!C, World!B!C, Hi!B!C, There!B!Cはコンソールで生成されます。

次に、MicrosoftのReactive Framework(NuGet "System.Reactive")を導入し、次の中間結果を生成しました。

async Task Main()
{
    string[] a0_source = new[] { "Hello", "World" };
    string[] a1_source = new[] { "Hi", "There" };

    IObservable<string> query =
        from a in a0_source.Concat(a1_source).ToObservable()
        from b in Observable.FromAsync(() => ExecuteB(a))
        from c in Observable.FromAsync(() => ExecuteC(b))
        select c;

    var output = String.Join(", ", await query.ToArray());

    Console.WriteLine(output);
}

private static async Task<string> ExecuteC(string value)
{
    return await Task.Run(() => value + "!C");
}

private static async Task<string> ExecuteB(string value)
{
    return await Task.Run(() => value + "!B");
}

次に、それをさらに一歩進めて、これを行うことができます。

async Task Main()
{
    string[] a0_source = new[] { "Hello", "World" };
    string[] a1_source = new[] { "Hi", "There" };

    IObservable<string> query =
        from a in a0_source.Concat(a1_source).ToObservable()
        from b in Observable.Start(() => a + "!B")
        from c in Observable.Start(() => b + "!C")
        select c;

    var output = String.Join(", ", await query.ToArray());

    Console.WriteLine(output);
}

今はかなりエレガントに見えます。最良の点は、簡単な.ToTask()呼び出しでオブザーバブルをタスクに簡単に変換できることですオブザーバブルも待っています。交換が簡単で、よりエレガントです。最良の点は、LINQ構文も使用していることです。さらに説明が必要な場合はお知らせください。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Rでのネストされた操作。よりエレガントな方法はありますか?

分類Dev

よりエレガントな方法はありますか?

分類Dev

ネストされた配列フィルタリング、よりエレガントな方法はありますか?

分類Dev

これらの条件を書くためのよりエレガントな方法はありますか?

分類Dev

Rのunitsパッケージから対数変換された軸と単位を処理するエレガントな方法はありますか?

分類Dev

これを書くためのより短く/エレガント/効率的な方法はありますか?

分類Dev

この「if」リストをよりエレガントな方法で書く方法はありますか?

分類Dev

このタイプの順列のためのよりエレガントな方法はありますか?

分類Dev

Kotlinと矢印でリストをNonEmptyListに変換するエレガントな方法はありますか?

分類Dev

エコー* | xargs -n1 echo、行ごとのリストのより短く、よりエレガントな方法はありますか?

分類Dev

印刷されたステートメントを、それを印刷したコード行までたどるエレガントな方法はありますか?

分類Dev

ニュートンの方法のよりエレガントなGo実装はありますか?

分類Dev

Pythonで相対パスを取得するためのエレガントな方法はありますか?

分類Dev

2つのネストされたオプションでラップされたオブジェクトをアンラップするエレガントな方法はありますか?

分類Dev

たくさんのクエリを書く代わりに、もっとエレガントな方法はありますか?

分類Dev

部分文字列を作成するためのよりエレガントな方法はありますか?

分類Dev

「何もしない」をラムダとして渡すエレガントな方法はありますか?

分類Dev

関係を定義するエレガントな方法はありますか?

分類Dev

C#で配列をネストするためのよりエレガントな方法はありますか?

分類Dev

ネストされたリスト内の要素をエレガントな方法でカウントします

分類Dev

処理されたデータをカウントするためのエレガントなPythonicの方法はありますか?

分類Dev

UIImageの複数の属性に対してよりエレガントな方法はありますか?

分類Dev

UIImageの複数の属性に対してよりエレガントな方法はありますか?

分類Dev

行列の各行のtop [2〜3]値のみを保持するエレガントな方法はありますか?

分類Dev

Scalaでどちらかのモナドを処理するエレガントな方法はありますか?

分類Dev

2つの要約の結果を互いに分割するエレガントな方法はありますか?

分類Dev

イベント/トリガーを定期的にチェックするためのよりエレガントな方法はありますか?

分類Dev

React Nativeでさまざまなコンポーネントを条件付きでレンダリングするためのより良いまたはよりエレガントな方法はありますか?

分類Dev

Javaの - 日付/時間を解析するエレガントな方法はありますか?

Related 関連記事

  1. 1

    Rでのネストされた操作。よりエレガントな方法はありますか?

  2. 2

    よりエレガントな方法はありますか?

  3. 3

    ネストされた配列フィルタリング、よりエレガントな方法はありますか?

  4. 4

    これらの条件を書くためのよりエレガントな方法はありますか?

  5. 5

    Rのunitsパッケージから対数変換された軸と単位を処理するエレガントな方法はありますか?

  6. 6

    これを書くためのより短く/エレガント/効率的な方法はありますか?

  7. 7

    この「if」リストをよりエレガントな方法で書く方法はありますか?

  8. 8

    このタイプの順列のためのよりエレガントな方法はありますか?

  9. 9

    Kotlinと矢印でリストをNonEmptyListに変換するエレガントな方法はありますか?

  10. 10

    エコー* | xargs -n1 echo、行ごとのリストのより短く、よりエレガントな方法はありますか?

  11. 11

    印刷されたステートメントを、それを印刷したコード行までたどるエレガントな方法はありますか?

  12. 12

    ニュートンの方法のよりエレガントなGo実装はありますか?

  13. 13

    Pythonで相対パスを取得するためのエレガントな方法はありますか?

  14. 14

    2つのネストされたオプションでラップされたオブジェクトをアンラップするエレガントな方法はありますか?

  15. 15

    たくさんのクエリを書く代わりに、もっとエレガントな方法はありますか?

  16. 16

    部分文字列を作成するためのよりエレガントな方法はありますか?

  17. 17

    「何もしない」をラムダとして渡すエレガントな方法はありますか?

  18. 18

    関係を定義するエレガントな方法はありますか?

  19. 19

    C#で配列をネストするためのよりエレガントな方法はありますか?

  20. 20

    ネストされたリスト内の要素をエレガントな方法でカウントします

  21. 21

    処理されたデータをカウントするためのエレガントなPythonicの方法はありますか?

  22. 22

    UIImageの複数の属性に対してよりエレガントな方法はありますか?

  23. 23

    UIImageの複数の属性に対してよりエレガントな方法はありますか?

  24. 24

    行列の各行のtop [2〜3]値のみを保持するエレガントな方法はありますか?

  25. 25

    Scalaでどちらかのモナドを処理するエレガントな方法はありますか?

  26. 26

    2つの要約の結果を互いに分割するエレガントな方法はありますか?

  27. 27

    イベント/トリガーを定期的にチェックするためのよりエレガントな方法はありますか?

  28. 28

    React Nativeでさまざまなコンポーネントを条件付きでレンダリングするためのより良いまたはよりエレガントな方法はありますか?

  29. 29

    Javaの - 日付/時間を解析するエレガントな方法はありますか?

ホットタグ

アーカイブ