.net websocket.ReceiveAsync 设置超时任务不起作用 CancellationTokenSource

恒拓信息科技 2018-04-23 01:34:57
最近在研究 .net 的.net websocket
服务器端设置一个超时,如果服务端在120内没有接受到客户端的任何信息,将跳出循环,终止监听,关闭socket
我做测试,客户端直接关闭进程,服务器端没有检测到断开,应该在120秒内结束任务,但不知道为什么一直不执行,
CancellationTokenSource 不起作用,我的环境是 vs2017 系统 server2012
哪位大神做过这一块,帮小弟指点一下

循环监听
while (socket.State == WebSocketState.Open)
{
CancellationTokenSource source = new CancellationTokenSource(120 * 1000); //120秒超时
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, source.Token);
if (source.IsCancellationRequested)
{
WriteLog("WebSocket监听超时120秒");
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure,
String.Empty, CancellationToken.None);
source.Dispose();
break; //获取的消息是关闭,跳出循环
}
source.Dispose();
if (result.MessageType == WebSocketMessageType.Close)
{
WriteLog("WebSocket接收到关闭消息");
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure,
String.Empty, CancellationToken.None);
break; //获取的消息是关闭,跳出循环
}
#region 消息处理(字符截取、消息转发)
。。。。。
。。。。。
#endregion
}
...全文
1900 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lujiaxing2007 2021-01-06
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
什么编程思路,现在还有循环? 只有初学者才会以为程序主过程都是一个大循环。现在正常的程序,都是让你注册一个委托的思路。例如 websocket 服务框架,通常会让你写类似
server.OnMessage(socket=>{.......});
server.OnOpen(socket=>{......});
server.OnError(socket=>{........});
这类代码。
你说的这叫什么话????? 你自己都说了用什么 WebSocket 服务框架... 我就不用框架我就手撸 WebSocket 监听我自己封装 WebSocket 行不行???? 你不用循环不用三方组件你给我写一个 WebSocket 监听我看看呗??? 问你什么你就答什么不行吗? yygq 有意思???????
  • 打赏
  • 举报
回复
嗯,使用 async/await,那么 await 本身就是回调,执行到 await socket.ReceiveAsync(buffer, source.Token) 这里的时候这个过程就结束了,然后过一会儿才会又让(某个线程池中的)线程从 await 左边和后边的代码开始执行。通常你的超时判断和关闭 socket 对象连接的代码应该在其它线程来处理,而不是在 await 后边去处理。
  • 打赏
  • 举报
回复
什么编程思路,现在还有循环? 只有初学者才会以为程序主过程都是一个大循环。现在正常的程序,都是让你注册一个委托的思路。例如 websocket 服务框架,通常会让你写类似
server.OnMessage(socket=>{.......});
server.OnOpen(socket=>{......});
server.OnError(socket=>{........});
这类代码。
想念旧时光 2018-12-14
  • 打赏
  • 举报
回复
你调试跟踪一下,是不是你的Socket没有关闭,所以才进不去。断点放在你关闭Socket的地方。

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧