2016-11-29 2 views
2

У меня есть список задач, которые я хочу выполнять параллельно, но ограниченным образом, почти как доработка без меня, чтобы управлять им. Мой подход состоял в том, чтобы использовать Parallel.ForEach и свойство MaxDegreeOfParallelism ParallelOptions. Я нахожу, что независимо от того, что я установил значение, все задачи запускаются в одно и то же время. Это нежелательное поведение. Я хочу, чтобы количество задач, выполняемых одновременно, было равно свойству. Я написал простой пример для иллюстрацииMaxDegreeOfParallelism Не применяется к списку задач?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var numbers = Enumerable.Range(1, 5); 
     var tasks = new List<Task>(); 

     foreach (int number in numbers) 
     { 
      tasks.Add(new Task(() => {Console.WriteLine("Starting thread {0} at time {1}. Starting delay...", Thread.CurrentThread.ManagedThreadId, DateTime.Now); 
      Thread.Sleep(1000); 
      Console.WriteLine("{0} is done at {1}.", Thread.CurrentThread.ManagedThreadId, DateTime.Now);})); 
     } 

     Parallel.ForEach(tasks, new ParallelOptions() { MaxDegreeOfParallelism = 2 }, t => 
     { 
      t.Start(); 
     }); 

     Task.WaitAll(tasks.ToArray()); 
    } 
} 

Вот результат: Console Output

Является ли мой подход или понимание неправильно?

+0

После прочтения документации и некоторых других вопросов - я разделяю ваше понимание, оно должно работать. Надеюсь, что кто-то знает ответ, этот меня немного испортит. – zmbq

+0

Привет Seapoe, MaxDegreeOfParallelism влияет на количество потоков, которые могут запускаться одновременно. Он не определяет, когда начинается каждый поток. – Riv

ответ

4

Я думаю, что вы немного смущены, максимальная степень параллелизма применяется к количеству задач, используемых параллельным ForEach, но внутри вы создаете новые задачи, они не контролируются ParallelOptions, а TaskScheduler ,

Если вы хотите ограничить количество одновременных задач, вы должны создать собственный TaskScheduler и ограничить количество запущенных задач.

Here вы можете найти пример.

+0

Интересно. Итак, в моем примере, если я удалю создание новых задач и поставлю исполняемый код внутри параллельного цикла, достигнет ли он того, что я ищу? – Seapoe

+0

Да, должно. – Gusman

+0

Да, это сработало! Большое спасибо! Я также рассмотрю пользовательский планировщик. – Seapoe