1

linqクエリによる注文があります。次のようなものです。

var sortedList = unsortedList
                    .OrderBy(foo => foo.GetCurrentValue())

ただし、メソッドGetCurrentValueの応答は遅くなります(ネットワーク通信が含まれ、かなりの遅延があるため)。私が観察している限り、上記のコードはメソッドを順次呼び出します(呼び出しは次の呼び出しが呼び出される前に終了する必要があるため、リストが長い場合、並べ替えは非常に遅くなります。

linqに並行して実行するように指示する方法はありますか?つまり、式を非同期で評価し、全員が終了した後で結果を比較しますか?

そうでない場合は、独自の実装をクリーンかつ簡単に作成する方法はありますか?

4

1 に答える 1

2

MSDNには、PLINQの「注文の保存」に関する記事があります-http ://msdn.microsoft.com/en-us/library/dd460677.aspx(私の以前のコメントによる)。リンクによって与えられた例:

var cityQuery = (from city in cities.AsParallel()
                 where city.Population > 10000
                 select city);

そして、可能な実装としてそれをそこに投げ出すだけです、このようなものですか?slowList「遅い」オブジェクトの列挙可能なコレクションはどこにありますか。Parallel.ForEach遅い値を収集するために、を他の非同期の「ステージング」操作に置き換えることができます。

    var stage1List = new List<dynamic>();
    var parOpt = new System.Threading.Tasks.ParallelOptions() { MaxDegreeOfParallelism = 30 };

    System.Threading.Tasks.Parallel.ForEach(slowList, parOpt, slowObj =>
    {
        stage1List.Add(new { Obj = slowObj, Value = slowObj.GetSlowValue() });
    });

    var stage2List = stage1List.OrderBy(p => p.Value).Select(p => p.Obj);
于 2012-05-22T03:44:15.467 に答える