2010-12-05 28 views
1

我一直在使用任務和BlockingCollections,他們做得很好。但據我所知,Take()方法刪除隊列中的對象。但是如果你想要2個任務同時訪問相同的值呢?C# - BlockingCollection:我們可以有2個線程Take()相同的值嗎?

假設我正在讀取文件,並通過blockingCollection.Add()將每行發送到2個任務,但我希望這兩個任務都按相同的順序獲取相同的行。 (每個任務都會對同一行做不同的事情)

我該怎麼做呢? BlockingCollection可以做到這一點嗎?或者我使用事件來傳遞值?如果是這樣,請解釋如何在另一個任務/線程中創建任務/線程的事件。

[編輯]如果我這樣做:

while (!lineCollection.IsCompleted) 
{ 
     Line line = lineCollection.Take(); 
     //do my processing 
     //then I add the original line back to the collection 
     lineCollection.Add(line); 
     //and use a "wait one" to wait for T2 to Take this line aswell 
     //Then continue my while loop 
} 

不是很優雅......這也不能保證同步。

回答

3

這聽起來像你只是想爲每個線程單獨的隊列。以相同的順序將相同的對象添加到每個隊列中,然後每個線程可以在閒暇時刪除它們。

+0

這絕對是一個選擇,但是,如果你正在處理非常大的文件,並且你不能在內存中保存重複內容,該怎麼辦? – Spectraljump 2010-12-05 20:18:29

相關問題