黑马程序员技术交流社区

标题: WPF多线程Socket侦听 跨线程操作UI控件时主线程卡死,求解? [打印本页]

作者: zhangcheng5468    时间: 2013-7-5 17:59
标题: WPF多线程Socket侦听 跨线程操作UI控件时主线程卡死,求解?
本帖最后由 zhangcheng5468 于 2013-7-5 18:17 编辑

wpf中服务器端负责侦听的socket放到子线程中区执行侦听,侦听到服务器端连接请求时要跨线程操作UI界面的文本款显示连接成功的状态信息,这时主线程任然会卡死,求解决方案
代码如下:{:soso_e122:}
  1. Socket socketwatch = null;
  2.         private void btn_connection_Click(object sender, RoutedEventArgs e)
  3.         {
  4.             
  5.             //创建服务端负责监听的Socket
  6.             socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  7.             IPAddress address = IPAddress.Parse(txt_ip.Text);//获取监听的IP地址
  8.             IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txt_port.Text));
  9.             socketwatch.Bind(endpoint);
  10.             socketwatch.Listen(10);// 设置监听队列的长度为10
  11.             Thread listenthread = new Thread(Listen);
  12.             listenthread.IsBackground = true;
  13.             listenthread.Start();
  14.         }
  15.         delegate void ListenDelegate();
  16.         private void Listen()
  17.         {
  18.             if (Dispatcher.Thread != Thread.CurrentThread)
  19.             {
  20.                 Dispatcher.Invoke(new ListenDelegate(Listen));
  21.             }
  22.             else
  23.             {
  24.                 Socket socketconmunication = socketwatch.Accept();//开始监听
  25.                 txt_info.AppendText("与客户端建立链接成功\r\n");
  26.             }
  27.         }
复制代码

作者: 许庭洲    时间: 2013-7-6 05:39
值得学习ing!
作者: zhangcheng5468    时间: 2013-7-6 07:44
这时正解:
  1. Socket socketwatch = null;
  2.         private void btn_connection_Click(object sender, RoutedEventArgs e)
  3.         {
  4.             
  5.             //创建服务端负责监听的Socket
  6.             socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  7.             IPAddress address = IPAddress.Parse(txt_ip.Text.Trim());//获取监听的IP地址
  8.             IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txt_port.Text.Trim()));
  9.             socketwatch.Bind(endpoint);
  10.             socketwatch.Listen(10);
  11.             Thread listenthread = new Thread(Listen);
  12.             listenthread.IsBackground = true;
  13.             listenthread.Start();

  14.             txt_info.AppendText("服务器启动成功!等待链接……\n");
  15.         }
  16.         Socket socketconmunication = null;
  17.         private void Listen()
  18.         {
  19.             while (true)
  20.             {
  21.                 socketconmunication = socketwatch.Accept();
  22.                 ShowMsg("客户端建立链接成功"+socketconmunication.RemoteEndPoint.ToString()+"\n");
  23.             }
  24.         }
  25.         delegate void ListenDelegate(string msg);
  26.         private void ShowMsg(string msg)
  27.         {
  28.             if (Dispatcher.Thread != Thread.CurrentThread)
  29.             {
  30.                 Dispatcher.Invoke(new ListenDelegate(ShowMsg),msg);
  31.             }
  32.             else
  33.             {
  34.                 txt_info.AppendText(msg);
  35.             }
  36.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2