[英].net Channels : Why producer output is consumed serially one after the other by the consumer/reader in an unbounded channel
主程序启动一个任务,该任务是 Channel 的消费者任务。 消费者任务代码为:
while (await channelReader.WaitToReadAsync())
{
while(channelReader.TryRead(out item))
{
console.writeline("item is"+item.clientId);
}
}
有套接字服务器。 当套接字客户端连接到服务器时,服务器为每个客户端启动任务。 每个客户端任务都是通道的生产者。 生产者代码是:
foreach (var item in itemList )
{
item.clientId = clientId;
await drawChannelWriter.WriteAsync(item);
}
发生的情况是:首先接收来自一个客户端的所有元素,然后接收来自其他任务的所有元素。 为什么频道中没有混合来自不同任务的不同元素?
Channels 是一个高性能异步就绪的生产者/消费者队列。 “高性能”位意味着它将尽可能同步完成。
当套接字客户端连接到服务器时,服务器为每个客户端启动任务。 每个客户端任务都是通道的生产者。
这可以。 我要检查的第一件事是每个客户端是否在单独的线程上运行(例如, Task.Run
),或者它们是否只是异步任务。
发生的情况是:首先接收来自一个客户端的所有元素,然后接收来自其他任务的所有元素。 为什么频道中没有混合来自不同任务的不同元素?
我希望无界通道上的WriteAsync
始终同步完成。 在内部,它只是将项目添加到队列中,并且由于队列始终有空间(在无界通道中),因此没有任何 AFAIK 可以使WriteAsync
异步完成。 因此,您的产品中的整个foreach
循环同步运行。
这种行为没有错。 如果您的生产者都在不同的线程上运行,那么它们可能同时运行它们的foreach
循环,并且元素可能是交错的。 但是每个foreach
循环都会运行得非常快,因此一个线程很可能会在另一个线程有机会之前添加它的所有项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.