并行产生来自多个来源的数据
我有一种情况,我想从多个来源异步流式传输相同类型的数据。数据结果应该在他们进入时出现。最简单的方法是什么?产量回报受阻,所以这不是我想要的。在下面的例子中,我想从源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();
}
}
你可以做的事情的同时 - 使用BlockingCollection
和线程数。每个输入和一个线程的一个线程 - 您的主线程可能 - yield-返回列表中的项目。
请注意,您可能无法到达列表的末尾 - 如果您的阅读器比您的编写者快,即使编写者稍后将更多数据写入列表,它也会认为它已到达列表的末尾。
在阅读器比编写器快的情况下,使用['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()'上阻塞,直到有更多数据可用。 –
好的,好主意。我会进行更正。 – zmbq
但是,如果没有可用项目,则阻止收集(如其名称所示)会阻止收集。这个问题明确表示要避免阻塞。 – svick
第一个函数应该可能返回'List'? –
rwong