并行地从多个来源产生数据

时间:2014-03-27 05:21:29

标签: .net asynchronous yield-return

我有一种情况,我想异步地从几个来源流式传输相同类型的数据。数据结果应该在它们进入时出现。最简单的方法是什么?收益率回报是阻塞所以这不是我想要的。在下面的示例中,我希望源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();
    }
}

1 个答案:

答案 0 :(得分:1)

您可以同时执行操作 - 使用BlockingCollection和几个线程。每个输入一个线程,一个 - 可能是主线程 - 从列表中返回项目。

请注意,您可能无法到达列表的末尾 - 如果您的读者比作者更快,它会认为它已到达列表的末尾,即使作者稍后会将更多数据写入列表。 / p>