如果 Channel 有 Complete 方法,为什么还需要 CancellationToken?

问题描述 投票:0回答:1

我正在使用

System.Threading.Channel
Channel.Reader.WaitToReadAsync
接受
CancelationToken
。但是,还有
Channel.Writer.TryComplete()
Channel.Writer.Complete()
方法。那么,如果我可以调用
Complete
来停止等待,为什么我要使用取消令牌来停止等待呢?

c# producer-consumer system.threading.channels
1个回答
1
投票

ChannelReader<T>.WaitToReadAsync
允许通道的消费者暂时或永久停止消费通道。例如,消费者可能必须每分钟执行一些定期工作,在这种情况下,它可以使用基于计时器的
CancellationTokenSource
来取消等待,执行定期工作,然后继续消费。

ChannelWriter<T>.Complete

可以防止通道的生产者写入更多消息,并且当通道耗尽时,它会通知通道的消费者不再有可用的消息。

所以这两个 API 有不同的用途。

¹

实际上,这种模式目前存在问题,因为内置 Channels 的实现中存在内存泄漏

© www.soinside.com 2019 - 2024. All rights reserved.