2014-10-11 77 views
1

在以下情況下:我們是否可以阻止主線程開始執行第3步,直到第2步完成?
我說的是C#Parallel.ForEach:如何阻止主線程,直到完成所有並行任務

//step 1: some tasks 
/* 
*/ 

//step 2: perform some sub tasks in parallel. 
Parallel.ForEach(X, x => Foo(x)); 

//step 3: Some other task 
//Can we begin to perform step 3 until all sub tasks in step 2 finished??? 
+2

'Parallel.ForEach'將等待。 – Ofiris 2014-10-11 07:01:43

回答

1

這應該是默認行爲。把它放在一個console.writeline的控制檯應用程序中,以便在需要時證明它。

0

如果使用Task類打造的「任務」,你所提到的,可能會嘗試Task.WaitAll(Task[])

+0

他沒有使用'Task'類,他使用'Parallel'類。這並不能解答這個問題。 – 2014-10-11 08:13:27

0

恕我直言,你的問題標題是從你打算問或達到什麼樣的不同。讓我們從你的帖子中瞭解到:

Parallel.ForEach開始執行時,它將阻塞主線程的執行,直到完成所有foreach中的並行執行爲止,而當並行處於打開狀態時,則需要執行步驟3也會得到執行,然後等待並行執行在主線程繼續之前完成,或者可能更多步驟,如3,4,5,然後等待並行執行完成後退出。以下代碼將有助於:

// Step 1 - Do something 

// Step 2 - Run tasks in parallel 
List<Task> taskList = new List<Task>(); 


for(int i=0; i< X; i++) 
{ 
    taskList.add(Task.Factory.StartNew((i) => {Foo(i); })); 
} 

// Step3 
// Step4 
// Step5 

// Wait for Tasks here 
Task.WaitAll(taskList.ToArray()) 

//Remaining steps and main thread exit 
+0

這不是OP所要求的。相反,他想阻塞,直到foreach循環完成,這是默認行爲。 – 2014-10-11 08:15:53

+0

@Yuval Itzchakov請再次回顧這個問題,你所建議的是標題和默認行爲,但是當第二步仍然處於打開狀態時,OP想要執行第三步,這就是爲什麼我建議兩個代碼之間存在差異並粘貼了代碼會做那份工作 – 2014-10-11 12:18:32

相關問題