2013-08-04 6 views
2

Можно создавать задачи внутри цикла, как это:Создание задач внутри цикла

List<Task<string>> tasks = new List<Task<string>>(); 
for (int id = 0; id < 1000; id++) 
{ 
    tasks.add(new Task<string>((tId) => 
     { 
      var taskId = (int)tId; 
      var rand = new Random(taskId); 
      long sum = 0; 
      for (int i = 0; i < 100000; i++) 
      { 
       sum += rand.Next(1000); 
      } 
      return string.Format("Task {0}: {1}", taskId, sum) ; 
     }, id)); 
} 

Затем начните все задачи, как это:

foreach (var task in tasks) 
{ 
    task.Start(); 
} 

Тогда ждать все закончить:

Task.WaitAll(tasks.ToArray()); 

Затем собрать результаты:

foreach (var task in tasks) 
{ 
    Console.WriteLine(task.Result); 
} 

Этот код работает, но я не могу контролировать степень параллелизма (количество максимальных потоков). , и я не знаю, правильна ли эта практика или нет?

+2

Любые причины не использовать Parallel LINQ для этого? Это звучит как более естественный подход. –

+0

Зачем вам нужно контролировать количество потоков? –

+0

@JonSkeet Можете ли вы помочь мне использовать P-LINQ !. Я новичок в TPL и LINQ :) –

ответ

2

This MSDN artical описывает, как переопределить класс планировщика заданий, чтобы достичь того, что вы хотите. Он называется LimitedConcurrencyLevelTaskScheduler, но небольшой совет ... я работал 2 месяца, чтобы получить абсолютно бесплатную работу и быстрое решение для моих требований, поэтому вам нужно исследовать много времени в этой задаче! Вы должны подумать о других решениях для этой проблемы.

Btw вы можете заглянуть в PLinq lib и MaxDegreeofParallelism. Но, как сказал мне разработчик mircosoft на семинаре. Не делай этого !. Задача lib и PLinq lib сильно оптимизированы в этом поле, поэтому, если вы измените это, вы получите гигантскую проблему с производительностью.

+0

Я не понимаю алгоритм, используемый в ваших словах «обложка», сэр. – KappaG3

+0

Хорошо для вас Краткая версия «Возможно, но не делайте этого. Трудно справиться, очень долгая задача, и если вы не потратили 2 месяца на то, что зарабатываете гигантские лаги производительности» ;-) – Venson

+2

Не стесняйтесь создавать у вас есть ответ dude a THAN критиковать других. – Venson

Смежные вопросы