/// <summary> /// 线程池回调方法 /// </summary> /// <param name="state">回调方法要使用的信息对象</param> private void ThreadPoolCallback(Object state) { // 如果无法进行转换,则 as 返回 null 而非引发异常 UdpMessage udpMessage = state as UdpMessage; try { // 执行任务 if (OnThreadTaskRequest != null) { OnThreadTaskRequest(udpMessage, EventArgs.Empty); } } catch { // 阻止异常抛出 } finally { // 关闭连接 // 从列表中移除连接 _mutexClients.WaitOne(); _mutexClients.ReleaseMutex(); } }
/// <summary> /// 侦听连接线程 /// </summary> private void ListenThreadAction() { // 启动侦听 //Start(); // 初始化连接列表和互斥量 //_tcpClients = new List<TcpClient>(); _mutexClients = new Mutex(); IPEndPoint remoteIpEndIPoint = new IPEndPoint(IPAddress.Any, port); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); // 接受连接 while (true) { try { if(udpReceive == null) udpReceive = new UdpClient(remoteIpEndIPoint); byte[] receiveBytes = udpReceive.Receive(ref iep); //udpReceive.Close(); //udpReceive = null; string question = Encoding.UTF8.GetString(receiveBytes); //MainWindow.insert_file("log.log", "GET:time=" + DateTime.Now.ToString("HH:mm:ss") + ",ques=" + question); UdpMessage udpMessage = new UdpMessage(iep, question); // 接受挂起的连接请求 //tcpClient = AcceptTcpClient(); // 将该连接通信加入线程池队列 ThreadPool.QueueUserWorkItem(ThreadPoolCallback, udpMessage); // 连接加入列表 _mutexClients.WaitOne(); //_tcpClients.Add(tcpClient); _mutexClients.ReleaseMutex(); } catch (SocketException se) { // 结束侦听线程 MainWindow.insert_file("error.log", "0time=" + DateTime.Now.ToString() + "=" + se.Message); //break; } catch (Exception ee) { // 加入队列失败 if (udpReceive != null) { MainWindow.insert_file("error.log", "0time=" + DateTime.Now.ToString() + "=" + ee.Message); udpReceive.Close(); udpReceive = null; } } } }