qq_36826830 2020-10-12 09:45 采纳率: 0%
浏览 154

websocket + 异步task IIS发布 线程死循环

现在做的是用websocket建立链接,然后服务器推送消息到客户端(若数据发送变化,则推送)
下面是服务端代码,本地已测试

public void ProcessRequest(HttpContext context)
        {
            if (context.IsWebSocketRequest)
            {
                context.AcceptWebSocketRequest(WebSocketRequestHandler);
            } 
        }
public async Task WebSocketRequestHandler(AspNetWebSocketContext webSocketContext)
        {

            //获取当前的WebSocket对象
            System.Net.WebSockets.WebSocket webSocket = webSocketContext.WebSocket;

            Bll.All_Device_Connect bld = new Bll.All_Device_Connect();

            int first = 0;
            string ffs = "", ses = "";

            if (webSocket.State == WebSocketState.Open)
            {
                while(true)
                {
                    DataTable dt = bld.GetList();
                    if (first == 0)
                    {
                        ffs = DBHelper.JsonHelper.DatatableToJosn(dt);
                        ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
                        buffer = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(ffs));
                        //发送数据(到客户端)
                        await webSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        first++;
                    }
                    else
                    {
                        ses = DBHelper.JsonHelper.DatatableToJosn(dt);
                        if (ffs != ses)//将此次结果与上一次结果进行比较
                        {
                            ffs = ses;//表字符串;若不同,则将该结果赋给ffs
                            ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
                            buffer = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(ffs));
                            //发送数据(到客户端)
                            await webSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                    if(webSocket.State!=WebSocketState.Open)
                    {
                        break;
                    }
                }

            }
        }

但是将其发布至IIS上,客户端页面刷新多次之后,iis worker process CPU占用率直线上升,导致websocket发不出任何消息,但是将iis worker process手动释放后又可以发出消息,不知道是不是while死循环的原因?(但是我需要while循环给它一直做判断)

  • 写回答

1条回答 默认 最新

  • Go 旅城通票 2020-10-12 10:12
    关注

    好像微软自带websocket百度出来蛮多你这个问题,用fleck来实现websocket试试,接收信息也比微软的好用。。

    评论

报告相同问题?

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用