2014-03-27 39 views
2

我有一種情況,我想從多個來源異步流式傳輸相同類型的數據。數據結果應該在他們進入時出現。最簡單的方法是什麼?產量回報受阻,所以這不是我想要的。在下面的例子中,我想從源B輸出數據之前將數據從源A.並行產生來自多個來源的數據

List<string> GetComputerRecordsFromA(int computerId) 
{ 
    Thread.sleep(100); 
    return new List<Record> {"Record1","Record2","Record3"}; 
} 

List<int> GetComputerRecordsFromB() 
{ 
    return new List<int> {"Record1","Record2","Record3"}; 
} 

IEnumerable<List<int>> GetDataBlocks() 
{ 
    //How to yield out in the order data comes available?? 
    var computerIds = new List<int> {1,3,99,4}; 
    foreach(int id in computerIds) 
    { 
     yield return GetDataFromA(); 
     yield return GetDataFromB(); 
    } 
} 
+0

第一個函數應該可能返回'List '? – rwong

回答

1

你可以做的事情的同時 - 使用BlockingCollection和線程數。每個輸入和一個線程的一個線程 - 您的主線程可能 - yield-返回列表中的項目。

請注意,您可能無法到達列表的末尾 - 如果您的閱讀器比您的編寫者快,即使編寫者稍後將更多數據寫入列表,它也會認爲它已到達列表的末尾。

+2

在閱讀器比編寫器快的情況下,使用['BlockingCollection'](http://msdn.microsoft.com/zh-cn/library/dd267312(v = vs.110).aspx) ['GetConsumingEnumerable()'](http://msdn.microsoft.com/en-us/library/dd287186%28v=vs.110%29.aspx),如果您的項目用完但未完成填充集合該枚舉將在'.GetNext()'上阻塞,直到有更多數據可用。 –

+0

好的,好主意。我會進行更正。 – zmbq

+0

但是,如果沒有可用項目,則阻止收集(如其名稱所示)會阻止收集。這個問題明確表示要避免阻塞。 – svick