using System.Threading.Channels; namespace Serein.Proto.WebSocket { /// /// 消息处理工具 /// public class WebSocketMessageTransmissionTool { private readonly Channel _msgChannel; public WebSocketMessageTransmissionTool(int capacity = 100) { _msgChannel = Channel.CreateBounded(new BoundedChannelOptions(capacity) { FullMode = BoundedChannelFullMode.Wait }); } /// /// 等待消息 /// /// public async Task WaitMsgAsync() { // 检查是否可以读取消息 if (await _msgChannel.Reader.WaitToReadAsync()) { return await _msgChannel.Reader.ReadAsync(); } return string.Empty; // 若通道关闭,则返回null } /// /// 写入消息 /// /// 消息内容 /// 是否写入成功 public async Task WriteMsgAsync(string msg) { try { await _msgChannel.Writer.WriteAsync(msg); return true; } catch (ChannelClosedException) { // Channel 已关闭 return false; } } /// /// 尝试关闭通道,停止写入消息 /// public void CloseChannel() { _msgChannel.Writer.Complete(); } } }