我正在使用
System.Threading.Channel
。 Channel.Reader.WaitToReadAsync
接受 CancelationToken
。但是,还有 Channel.Writer.TryComplete()
或 Channel.Writer.Complete()
方法。那么,如果我可以调用 Complete
来停止等待,为什么我要使用取消令牌来停止等待呢?
ChannelReader<T>.WaitToReadAsync
允许通道的消费者暂时或永久停止消费通道。例如,消费者可能必须每分钟执行一些定期工作,在这种情况下,它可以使用基于计时器的CancellationTokenSource
来取消等待,执行定期工作,然后继续消费。
可以防止通道的生产者写入更多消息,并且当通道耗尽时,它会通知通道的消费者不再有可用的消息。
所以这两个 API 有不同的用途。¹
实际上,这种模式目前存在问题,因为内置 Channels 的实现中存在内存泄漏。