繁体   English   中英

.net 通道:为什么生产者 output 在无界通道中由消费者/读者一个接一个地连续消费

[英].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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM