C# 从块中读取IEnumerable

C# 从块中读取IEnumerable,c#,.net,ienumerable,C#,.net,Ienumerable,我从库函数接收阻塞IEnumerable(就像永不结束的流)。有时它包含一些消息,有时包含很多消息。我需要从中获取所有现有消息,我不想等待新消息 此代码获取现有消息并等待10秒超时 var cancellationTokenSource = new CancellationTokenSource(10000); foreach (var data in consumer.Consume(cancellationTokenSource.Token)) { Console.WriteLine

我从库函数接收阻塞IEnumerable(就像永不结束的流)。有时它包含一些消息,有时包含很多消息。我需要从中获取所有现有消息,我不想等待新消息

此代码获取现有消息并等待10秒超时

var cancellationTokenSource = new CancellationTokenSource(10000);
foreach (var data in consumer.Consume(cancellationTokenSource.Token))
{
    Console.WriteLine(data.message);
}
我应该如何修改我的代码

public IEnumerable<Message> Consume(CancellationToken? cancellationToken = null)
公共IEnumerable消费(CancellationToken?CancellationToken=null)
我想把问题进一步抽象出来。我个人不会在循环数据时执行消费。我将实现一个线程计时器,它将排队到堆栈或队列中。然后让您的循环Pop项目进行处理。您甚至可能会发现,为了应对波动性,您需要使用ConcurrentQueue。

我想这会满足您的需求

如果集合为空,则此方法立即返回false

变通办法

所以,我们有无限的IEnumerable。如果其中没有消息,“foreach”将等待它们出现。幸运的是,我们的“消费”方法接受一个取消令牌,我们可以在循环中更改它。在处理来自IEnumerable的第一条消息之后,我设置了“CancelAfter(1000)”——类似于超时。如果一秒钟内出现新消息,计时器将重置。当队列为空时,计时器触发,我们中断循环(请尝试…捕获OperationCanceledException Required)


BlockingCollection.ToArray可能会起作用,但不确定是否只有一个注释
consumer
变量的类型是什么?唉,ToArray()在这个永无止境的streem中等待结束。“consumer”是特定于主题的对象,听起来像是您真正想要的可枚举对象。您是否控制生成可枚举项的库?您能否解释一下您的解决方案是如何工作的/为什么工作的?这将使OP和其他人能够理解并在其他地方应用您的变通方法(如果适用)-
while (bc.TryTake(out T))
{
}
var cancellationTokenSource = new CancellationTokenSource(1000);
foreach (var data in consumer.Consume(cancellationTokenSource.Token))
{
    Console.WriteLine(data.message);
    cancellationTokenSource.CancelAfter(1000);
}