3

私は 70-516 MS 試験の資料に従っていますが、AsOrdered メソッドを使用すると、並列処理を実行しながら順序付けされた処理を保証できると説明しているセクションに出くわしました。

ただし、以下の例を実行すると、結果が順番に出力されません。

基本的に、以下のサンプル コードは、10 個の整数の列挙可能なコレクションから始まり、次に並列化され、並べ替えられ、最後に、Compute 関数が偶数を返す要素のみを選択することによってフィルター処理されます。Compute 関数は、1 秒の遅延の後、入力を返すだけです。

private void TestLinqParallel()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        var source = Enumerable.Range(1, 10).AsParallel().AsOrdered();
        var evenNums = from num in source
                       where Compute(num) % 2 == 0
                       select num;
        evenNums.ForAll(ev =>
        {
            Debug.WriteLine(string.Format("{0} on Thread {1}", ev, Thread.CurrentThread.GetHashCode()));

        });
        sw.Stop();
        Debug.WriteLine(string.Format("Done {0}", sw.Elapsed));
    }
    public int Compute(int num)
    {
        Debug.WriteLine(string.Format("Computing {0} on Thread {1}", num, Thread.CurrentThread.GetHashCode()));
        Thread.Sleep(1000);
        return num;
    }

本の状態

AsOrdered 拡張メソッドが保証しているのは、少なくとも偶数の場合、結果は順序付けられます。

しかし、ここに私の結果があります.4の処理は2の処理の前に来ます

Computing 4 on Thread 11
Computing 3 on Thread 10
Computing 2 on Thread 12
Computing 1 on Thread 6
4 on Thread 11
Computing 7 on Thread 11
Computing 6 on Thread 6
2 on Thread 12
Computing 8 on Thread 12
Computing 5 on Thread 10
Computing 9 on Thread 11
6 on Thread 6
Computing 10 on Thread 6
8 on Thread 12
10 on Thread 6
Done 00:00:03.0561023

誰でも助けることができますか?

4

1 に答える 1

3

ForAll並列化されます。これは、コード本体が同時に実行されるため、すべての順序保証がウィンドウの外に出ることを意味します。foreachループを試してください。

于 2013-03-09T23:13:43.583 に答える