这件事说明了一切。具体来说,假设我以这种方式创建了Channels。
Channel<byte[]> Stream { get; set; }
void Create()
{
Stream = System.Threading.Channels.Channel.CreateUnbounded<byte[]>();
}问题
可以按以下顺序处理吗?
public virtual void Dispose()
{
if (Stream.Writer.TryComplete()) // Dispose writer
{
Stream.Reader.Completion.ContinueWith(o => // Dispose reader
{
// Dispose the rest, e.g. some streaming server
}).Unwrap();
}
}一般来说,它可以工作,但是我想确保如果这段代码被多次执行,它不会导致内存泄漏或意外的运行时异常。
发布于 2022-03-30 14:41:03
我认为您的dispose方法是正确的,因为TryComplete只返回true一次,而且它是线程安全的。
但是有一个问题,您向订阅者公开频道,因此他们能够显式调用TryComplete/Complete来完成编写器。最好把它隐藏起来,只公开一个写方法。
public class StreamServer : IDisposable
{
protected virtual Channel<byte[]> Stream { get; set; }
public ValueTask WriteAsync(byte[] item) => Stream.Writer.WriteAsync(item);
}https://stackoverflow.com/questions/71612218
复制相似问题