.NET WebSocket开发疑问:循环应置于处理方法还是Task内?
.NET原生WebSocket开发疑问解答
我在.NET中使用原生WebSocket(非SignalR)开发时,参考了一篇实用文章,以下是示例代码:
public class WSHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.IsWebSocketRequest) { context.AcceptWebSocketRequest(ProcessWSChat); } } public bool IsReusable { get { return false; } } private async Task ProcessWSChat(AspNetWebSocketContext context) { WebSocket socket = context.WebSocket; while (true) { ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]); WebSocketReceiveResult result = await socket.ReceiveAsync( buffer, CancellationToken.None); if (socket.State == WebSocketState.Open) { string userMessage = Encoding.UTF8.GetString( buffer.Array, 0, result.Count); userMessage = "You sent: " + userMessage + " at " + DateTime.Now.ToLongTimeString(); buffer = new ArraySegment<byte>( Encoding.UTF8.GetBytes(userMessage)); await socket.SendAsync( buffer, WebSocketMessageType.Text, true, CancellationToken.None); } else { break; } } } }
疑问与解答
应该将
while (true)循环放在处理方法内,还是返回一个Task?
必须把循环放在处理方法内部,不能用return new Task(() => { ... })这种方式。AcceptWebSocketRequest要求传入的是一个异步方法(返回Task),async/await模式下,方法内的逻辑会被框架自动调度执行。如果手动创建Task但不启动(比如没调用Task.Start()),这个任务永远不会执行,这就是你尝试第二种方法时循环没运行的原因。如果循环放在处理方法内,为何方法要返回Task?
返回Task是.NET异步编程模型的标准要求,ASP.NET需要通过这个Task跟踪WebSocket会话的生命周期:它能知道这个异步操作何时完成,从而正确释放连接资源、管理请求上下文。async方法返回的Task本质是一个异步操作的"句柄",框架可以等待它完成,避免阻塞线程,提升服务器的并发能力。
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

