У меня есть следующий код C#: [code]var rand = new Random(1); var range = Enumerable.Range(1, 8); var partition = Partitioner.Create(range, EnumerablePartitionerOptions.NoBuffering); foreach (var x in partition .AsParallel() .AsOrdered() .WithMergeOptions(ParallelMergeOptions.NotBuffered) .WithDegreeOfParallelism(4) .Select(DoSomething)) { Console.WriteLine($"---- {x} {DateTime.Now.TimeOfDay} " + $"{Thread.CurrentThread.ManagedThreadId}"); }
int DoSomething(int x) { Console.WriteLine($"WAIT {x} {DateTime.Now.TimeOfDay} " + $"{Thread.CurrentThread.ManagedThreadId}"); int random; lock (rand) { random = rand.Next(2000); } Thread.Sleep(random); //fake work being done Console.WriteLine($"DONE {x} {DateTime.Now.TimeOfDay} " + $"{Thread.CurrentThread.ManagedThreadId}"); return x; } [/code] Вот результат: [code]WAIT 2 13:51:08.8398170 10 WAIT 1 13:51:08.8398197 9 WAIT 3 13:51:08.8398132 11 WAIT 4 13:51:08.8398108 4 DONE 1 13:51:09.0805471 9