WebSocket.ReceiveAsync的ValueTask重载使用方法及相关问题咨询
WebSocket ReceiveAsync重载常见问题解答
如何在Memory<T>入参的重载中获取关闭相关属性
当你调用返回ValueTask<ValueWebSocketReceiveResult>的重载时,即使ValueWebSocketReceiveResult本身没有CloseStatus和CloseStatusDescription属性,你也可以直接从当前WebSocket实例的同名属性中读取这两个值。
当接收结果的MessageType为WebSocketMessageType.Close时,.NET运行时已经自动将关闭状态和描述填充到了WebSocket实例的属性中,直接读取即可完成关闭握手的处理逻辑。
ValueTask版本重载的性价比分析
- 性能优势:
ValueTask<T>返回值在接收操作同步完成(例如内核缓冲区已经有可用数据)的场景下,完全避免了传统Task<T>的堆分配,高并发场景下可以大幅降低GC压力,吞吐量提升明显。 - 灵活性优势:
Memory<T>作为入参支持的场景远多于ArraySegment<T>,除了托管数组之外,还可以包装栈内存、非托管内存、内存池块等多种数据源,不需要额外做类型转换,适配更多高性能编程场景。 - 适用场景:除非你有明确的兼容需求(例如要支持.NET Framework等不支持
Memory<T>的旧框架),或者你的业务逻辑必须从接收结果中直接读取关闭属性,否则优先选择这个重载收益更高。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

