0

私はオブジェクトのコレクションを持っています。これらの各オブジェクトを個別のスレッドで 1 つずつ順番に処理する必要があります。同時スレッド数を 4 などに修正する必要があります。バージョン 3.5 の .NET Framework によって制限されている場合、これを行う最善の方法は何ですか?

編集:「順番に」とは、最初のオブジェクトの処理を開始する必要があることを意味しました。その後、まだ処理されている間に、2 番目、3 番目、4 番目のオブジェクトの処理が開始されます。5 番目のオブジェクトは、これら 4 つのオブジェクトの処理が完了するまで待機します。しかし、たとえば、5 番目のオブジェクトが処理されなかった場合、6 番目のオブジェクトは処理できません。一部のダウンロード マネージャーがこのように動作することに気付いたかもしれません。

4

2 に答える 2

0

項目 6 の説明では、項目 5 のプロセスが開始されたら、処理が完了していなくても問題ないと思います。

の自然な仕事のようにConcurrentQueue<T>聞こえますが、それは 4.0 です。

LLQueueは 4.0 であるため、 のサポートを削除すれば 3.5 に移植できますIProducerConsumerCollection<T>が、残りは 2.0 以降で動作するはずです。

次に、4 つ (またはいくつでも) のスレッドを用意し、それぞれTryDequeueが false を返すまで呼び出し続け、true を返す場合は、取得したアイテムを処理します。

于 2012-08-28T22:53:44.437 に答える
0

あなたの質問は私を少し混乱させます。4 のバッチで処理する理由がわかりません。

このプロセスは 4 つのバッチで並行して行われます。バッチ内の順序は保証されません。

public void ParallelOne()
    {
        int[] nums = Enumerable.Range(0, 8).ToArray();
        Debug.WriteLine(nums.Count().ToString() + " " + nums[nums.Count()-1].ToString());
        long total = 0;


        for (int k = 0; k < 2; k++)
        {
            total = 0;
            // Use type parameter to make subtotal a long, not an int
            Parallel.For<long>(k*4, (k+1)*4, () => 0, (j, loop, subtotal) =>
            {
                subtotal += nums[j];
                Debug.WriteLine(subtotal.ToString() + " " + j.ToString());
                return subtotal;
            },
                (x) => Interlocked.Add(ref total, x)
            );

            Debug.WriteLine("The total is {0}", total);
        }

    }

4 スレッドの動的並列が必要な場合は、Paralled.ForEach を使用し、WithDegreeOfParallelism を使用してトレッドを 4 に調整します。

于 2012-08-29T00:23:22.327 に答える