2011-12-22 48 views
2

關於同步線程有很多資源,即何時以及如何啓動它們。
但是,我想啓動線程,並以有序方式檢索輸出結果。將線程池輸出排序爲流數據

例如,如果我有:
線程1輸出繼電器:數據1
線程2輸出繼電器:數據2
線程3輸出繼電器:數據3

我將開始線程順序(線程1,2 ,3),並且我想檢索有序列表中的數據(數據1,2,3)。正如你所知道的,我不能保證線程2會在線程3之前完成並提供它的輸出。所以我需要一些有效的方法來重新引入順序和順序,因爲線程正在提供他們期望的輸出。

編輯:
非常重要的精度(如由評論員指出):
線程池是要全天候運行和數據不被固定設置,但一個數據流。
另外,由於遺留問題,我必須使用.Net 3.5。

+1

如果你希望輸出順序依舊,爲什麼還要使用線程呢? – 2011-12-22 20:43:03

+0

它是針對一組固定的數據,還是計劃在一段時間內同時運行線程(又名管道)? – alexm 2011-12-22 20:44:44

+2

@ M.Babcock您可以使用線程快速處理項目,但仍希望以有序的方式處理結果。這不是一個不常見的要求。 – 2011-12-22 20:48:52

回答

1

這裏的一個好的選擇是使用PLINQ。

它可以讓你編寫創建您的數據的查詢,如下所示:

var results = inputData.AsParallel().AsOrdered().Select(inputValue => ComputeOutputData(inputValue)); 

在這種情況下,調用AsOrdered將允許查詢並行運行,但是你的結果再來適當的原始秩序。

+1

您可能要提的一個警告是,PLINQ僅在.NET 4中可用(完全)。如果您以前使用了任何東西,則需要實現自己的同步機制。 – 2011-12-22 20:55:18

+0

哇,PLINQ很酷! – zmbq 2011-12-22 21:01:53

+0

請參閱編輯 – 2011-12-22 21:10:38