.net 并行地从多个源产生数据

.net 并行地从多个源产生数据,.net,asynchronous,yield-return,.net,Asynchronous,Yield Return,在这种情况下,我希望异步地从多个源传输相同类型的数据。数据结果应该在输入时输出。最简单的方法是什么?收益率是阻塞的,所以这不是我想要的。在下面的示例中,我希望源B的数据在源A的数据之前输出 List<string> GetComputerRecordsFromA(int computerId) { Thread.sleep(100); return new List<Record> {"Record1","Record2","Record3"}; } L

在这种情况下,我希望异步地从多个源传输相同类型的数据。数据结果应该在输入时输出。最简单的方法是什么?收益率是阻塞的,所以这不是我想要的。在下面的示例中,我希望源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();
    }
}
列出GetComputerRecordsFromA(int computerId)
{
睡眠(100);
返回新列表{“Record1”、“Record2”、“Record3”};
}
列表GetComputerRecordsFromB()
{
返回新列表{“Record1”、“Record2”、“Record3”};
}
IEnumerable GetDataBlocks()
{
//如何在订单数据可用的情况下产出??
var computerIds=新列表{1,3,99,4};
foreach(computerIds中的int-id)
{
返回GetDataFromA();
返回GetDataFromB();
}
}

您可以同时执行操作-使用
阻止集合和一些线程。一个线程用于每个输入,一个线程(可能是您的主线程)用于从列表中返回项目


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

在读卡器比写卡器快的情况下,最好使用它,如果项目已用完,但尚未填充完集合,则可枚举项将在
.GetNext()
上阻塞,直到有更多数据可用。但如果没有可用的项目,则阻塞集合(顾名思义)将阻塞。这个问题特别提到要避免阻塞。如果还有更多的项尚未到达,则无法避免阻塞IEnumerable。如果你不想这样,你必须使用一个不同的接口,而不是一开始就使用收益率。OP特别询问了收益率返回。第一个函数可能应该返回
List