【问题标题】:yielding data from multiple sources in parallel并行产生来自多个来源的数据
【发布时间】:2014-05-05 21:54:24
【问题描述】:

我有一种情况,我想从多个来源异步传输相同类型的数据。数据结果应该在输入时输出。最简单的方法是什么? 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();
    }
}

【问题讨论】:

  • 第一个函数应该返回List&lt;int&gt;?

标签: .net asynchronous yield-return


【解决方案1】:

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

请注意,您可能无法到达列表末尾 - 如果您的阅读器比您的编写器快,即使编写器稍后会向列表写入更多数据,它也会认为它已到达列表末尾。

【讨论】:

  • 在阅读器比编写器快的情况下,最好使用BlockingCollectionGetConsumingEnumerable(),如果你用完了项目但还没有完成填充集合,枚举将阻塞@ 987654326@ 直到有更多数据可用。
  • 但是如果没有可用的项目,则阻塞集合(顾名思义)会阻塞。该问题明确指出要避免阻塞。
  • 如果还有更多的项目尚未到达,您将无法避免阻塞 IEnumerable。如果你不想这样,你必须使用不同的接口,而不是首先使用 yield-return 。 OP 专门询问了收益率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多