并行产生来自多个来源的数据

问题描述:

我有一种情况,我想从多个来源异步流式传输相同类型的数据。数据结果应该在他们进入时出现。最简单的方法是什么?产量回报受阻,所以这不是我想要的。在下面的例子中,我想从源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

你可以做的事情的同时 - 使用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