2013-06-03 2 views
1

Я проделал довольно много исследований по этому вопросу, но я все еще не могу понять, что это правильно. Мне нужно создать pdf-файл с 1000 страницами (я использую библиотеку) и вам нужно сделать это N раз для разных данных. Данные независимы друг от друга, и я могу полностью генерировать это параллельно, и это то, что я пытаюсь сделать. В идеале я хотел бы, чтобы это было сделано в 10 потоках, каждый поток генерировал pdf в памяти и сохранял его в конце. Скажем, это займет 15 минут в pdf (с 1000 страниц), если я буду делать это последовательно, это будет 150 минут для 10 pdf-файлов, например, 30 минут, если я буду использовать 10 потоков. Я знаю, что люди не очень любят нить, но как я могу ускорить это в противном случае?Запуск задачи в разных потоках в консольном приложении

Я смотрел ThreadPool, но затем я вижу это новое Task в 4.0. Я читал, что могу заставить каждую задачу работать в отдельном потоке, если я использую TaskCreationOptions.LongRunning, но это, похоже, не работает для меня. Я также пытался использовать ThreadPool, но поскольку каждый PDF генерируется из URL-адреса, и по какой-то причине метод WebRequest.Create(url), похоже, не выполняется при вызове из threadpool? Но я предпочел бы, чтобы новая библиотека задач работала.

Это то, что у меня есть сейчас, но оно все еще похоже на выполнение последовательно.

Task myTask= Task.Factory.StartNew(() => 
       { 
        //code for the task. 
        //get html content 
        //generate pdf file. 
       } 
       }, new CancellationToken(false), TaskCreationOptions.LongRunning, TaskScheduler.Default); 

myTask.Wait(); 

Что я здесь делаю неправильно? Если у Вас есть предложения, пожалуйста, дайте мне знать. На данный момент я не могу идти выше .net 4.0.

+0

Сколько задач вы создаете? Это только начинается один новый поток, а затем ждет результат – flup

+0

Определить ... «Это, похоже, не работает для меня». Какова ваша приблизительная синхронизация, последовательная и многопоточная? – Kevin

+1

Могу ли я предложить parallel.foreach? – redtuna

ответ

9

myTask.Wait() останавливает выполнение контрольной нити, пока задача не завершится ... Вы не хотите останавливать выполнение сразу после запуска одной из этих задач.

Что нужно сделать, это создать сразу несколько задач, запустить их, а затем вызвать Task.WaitAll(array), чтобы дождаться, когда они ВСЕ завершатся, а не ждут по одному за раз.

// Define your tasks and start them all 
var task1 = Task.Factory.StartNew(() => { /*do something*/ }); 
var task2 = Task.Factory.StartNew(() => { /*do something*/ }); 
var task3 = Task.Factory.StartNew(() => { /*do something*/ }); 

// Wait for ALL tasks to finish 
// Control will block here until all 3 finish in parallel 
Task.WaitAll(new[] { task1, task2, task3 }); 
+1

У меня создалось впечатление, что вы все равно получите только выполнение задания для каждого ядра, делающего это так? – Jammer

+0

Примерно один на ядро, да. Существует эвристика, которая определяет, как планировать/выполнять их. OP мог отметить эти Длинные Бега, если они так выбрали; Я просто даю пример. – Haney

+1

Я бы просто начал использовать Threads непосредственно в этой ситуации. Threading не так страшно в .NET, что многие люди чувствуют! – Jammer

0

Если вы считаете, что знаете, сколько потоков вы хотите, вы должны просто пойти и использовать потоки. Просто запустите все эти потоки, а затем дождитесь их завершения.

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