あなたのIEnumerableは本当にインデクサーを持っていた何か(つまり、あなたがアイテムを出すためにobj[1]
を行うことができます)、それはあなたが書く必要があることを行うことができない場合は、しかし、次の
var rangePartitioner = Partitioner.Create(0, source.Length);
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
// Loop over each range element without a delegate invocation.
for (int i = range.Item1; i < range.Item2; i++)
{
var item = source[i]
//Do work on item
}
});
を行うことができた場合System.Collections.Concurrent.Partitioner<TSource>
から派生した新しいクラスを作成してカスタムパーティショナーを作成します。その件名は余りに広すぎてSOの答えでカバーすることはできませんが、開始するにはthis guide on the MSDNをご覧ください。
UPDATE:彼らはデータをバッファリングしないPartitioner.Create
過負荷を追加 .NET 4.5の時点で、それはあなたが得ることはありませんこれで1の範囲の最大サイズとカスタムパーティショナーを作るのと同じ効果があります1つのスレッドは、一連の遅い項目が残っていると不運になってしまった場合には、キューに入れられた作業がたくさんあります。
var partitoner = Partitioner.Create(source, EnumerablePartitionerOptions.NoBuffering);
Parallel.ForEach(partitoner, item =>
{
//Do work
}
なぜこれが(興味のある) –
チャンクかチャンクごとのサイズでチャンクアップしますか? – SimpleVar
IEnumerableを持っていますか、またはインデクサーを実装していますか(これで 'obj [i]'を実行できますか?)あなたがインデックスを渡すことができれば私は解決策を持っています。 –