private static HandleResult ProcessPacket(IServer sender, IntPtr id, Packet packet) { var result = HandleResult.Ignore; switch (packet.Type) { case PacketType.Echo: // 假如回显是一个非耗时操作, 在这处理 { // 回显数据 var data = PacketHelper.ToSendBytes(packet); result = sender.Send(id, data, data.Length) ? HandleResult.Ok : HandleResult.Error; break; } case PacketType.Time: // 假如获取服务器时间是耗时操作, 将该操作放入队列 { // 向线程池提交任务 if (!ThreadPool.Submit(ThreadProc, new { sender, id, packet })) // 线程池传参, 这里使用的是匿名对象 { result = HandleResult.Error; } break; } default: result = HandleResult.Error; break; } return(result); }
/// <summary> /// 线程池回调函数 /// </summary> /// <param name="obj"></param> static void ThreadProc(object obj) { // 解构动态对象 dynamic dyObj = obj; IServer sender = dyObj.sender; IntPtr id = dyObj.id; Packet packet = dyObj.packet; // 如果连接已经断开了(可能被踢了) // 它的任务就不做了(根据自己业务需求来, 也许你的任务就是要完成每个连接的所有任务, 每个包都要处理, 不管连接断开与否, 就不要写这个判断, 但是你回发包的时候要判断是否有效连接) if (!sender.IsConnected(id)) { return; } if (packet.Type != PacketType.Time) { return; } // 模拟耗时操作 System.Threading.Thread.Sleep(6000); // 组织回包 packet = new Packet { Type = PacketType.Time, Data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), }; // 发送数据 var data = PacketHelper.ToSendBytes(packet); if (!sender.Send(id, data, data.Length)) { // 发送失败断开连接 sender.Disconnect(id); } }