Обновление - изменил название вопроса, чтобы отразить то, что я действительно после
Рассмотрим следующий фрагмент кода:
// this query generates 12 instances of Func<int>, which each when executed
// print something to the console and wait for 1 second.
var actions = Enumerable.Range(0, 12).Select(i => new Func<int>(() =>
{
Console.WriteLine("{0} - waiting 1 sec", i);
Thread.Sleep(1000);
return 1;
}));
// define a parallel query. Note the WithDegreeOfParallelism call here.
var query = from action in actions.AsParallel().WithDegreeOfParallelism(12)
select action();
// execute, measuring total duration
var stopw = Stopwatch.StartNew();
query.ToList();
Console.WriteLine(stopw.Elapsed);
Console.WriteLine(Environment.ProcessorCount); // 3 on my machine
При пропуске вызова на WithDegreeOfParallelism
это выполняется в 4 чанках, что занимает в общей сложности около 4 секунд, чего я и ожидал, так как мой процессор равен 3.
Однако, когда я звоню WithDegreeOfParallelism
с любого номера выше 4, я всегда получаю 3 чанка, и общая продолжительность не превышает 3 секунд. Я ожидаю, что значение 12 получит общую продолжительность (чуть больше) 1 секунды.
Что мне не хватает? И как я могу обеспечить параллельное выполнение более 4 задач, не требующих интенсивной работы процессора, что мне и нужно?
Обновление: я, конечно, мог бы вернуться к ручному раскручиванию потоков, но я надеялся, что новая библиотека PFX сделает это немного проще ... В любом случае, приведенный ниже код дает мне около 1 секунды общего времени выполнения
List<Thread> threads = new List<Thread>();
for (int i = 0; i < 12; i++)
{
int i1 = i;
threads.Add(new Thread(() =>
{
Console.WriteLine(i1);
Thread.Sleep(1000);
}));
}
threads.ForEach(t => t.Start());
threads.ForEach(t => t.Join());