2013-06-03 48 views
1

我已經對此做了相當多的研究,但我似乎仍然無法做到。我必須生成一個包含1000頁的pdf文件(我使用庫),並且需要針對不同的數據執行N次。數據是相互獨立的,我可以完全並行地生成這個數據,這正是我想要做的。理想情況下,我希望在10個線程中完成此操作,每個線程在內存中生成pdf並在最後保存。假設每個pdf需要15分鐘(有1000頁),如果我按順序執行此操作,那麼對於10個pdf文件,這需要150分鐘,如果使用10個線程,則需要30分鐘。我知道人們不太喜歡穿線,但是我怎麼能加速呢?在控制檯應用程序中的不同線程中運行任務

我在看ThreadPool,但後來我在4.0中看到這個新的Task。我讀過如果我使用​​但我覺得這似乎不起作用,我可以強制每個任務在單獨的線程中運行。我也嘗試使用ThreadPool,但由於每個PDF都是從url生成的,出於某種原因,從線程池調用WebRequest.Create(url)方法似乎不執行?但我想我寧願讓新的任務庫工作。

這是我現在有的,但它似乎仍然順序執行。

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

我只想繼續在這種情況下直接使用線程。 .NET中的線程並不是可怕的,很多人都覺得! – Jammer

0

如果你認爲你知道你想要多少線程,你應該繼續使用線程。只需啓動所有這些線程,然後等待所有這些線程完成。

相關問題