示例#1
0
        /// <summary>
        /// 线程池任务回调函数
        /// </summary>
        /// <param name="obj">任务参数</param>
        private void TaskTaskProc(object obj)
        {
            if (!(obj is TaskInfo taskInfo))
            {
                return;
            }

            // 如果连接已经断开了(可能被踢了)
            // 它的任务就不做了(根据自己业务需求来, 也许你的任务就是要完成每个连接的所有任务, 每个包都要处理, 不管连接断开与否, 就不要写这个判断, 但是你回发包的时候要判断是否有效连接)
            if (!_server.IsConnected(taskInfo.Client.ConnId))
            {
                return;
            }

            // 在这里处理耗时任务逻辑

            switch (taskInfo.Packet.Type)
            {
            case PacketType.Time:
            {
                // 模拟耗时操作
                Thread.Sleep(6000);

                // 组织packet为一个json
                var json = JsonConvert.SerializeObject(new Packet
                    {
                        Type = PacketType.Time,
                        Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    });

                // json转字节数组
                var bytes = Encoding.UTF8.GetBytes(json);

                // 先发包头
                if (!SendPacketHeader(_server, taskInfo.Client.ConnId, bytes.Length))
                {
                    // 发送失败断开连接
                    _server.Disconnect(taskInfo.Client.ConnId);
                    break;
                }

                // 再发实际数据
                if (!_server.Send(taskInfo.Client.ConnId, bytes, bytes.Length))
                {
                    _server.Disconnect(taskInfo.Client.ConnId);
                }

                // 至此完成当前任务
                break;
            }
            }
        }