socket新打开窗口之后,原窗口的文本域无法显示新消息

自己写了个winform界面程序,过程中出现了一个问题。客户端在登录成功后接受不到服务器的消息了。排查了很多问题,发现是新窗体打开的才导致接收不到消息。

上网查解决办法,第一个找到的是form.show 和form.showdialog区别,

form.show()方法打开的窗体被称作非模式窗体。这种非模式窗体及时还用户还没有处理,用户也可以切换到其他的窗体进行其他的操作。非模式窗体让用户的操作更加灵活便捷。用户可以方便的在不关闭非模式窗体的情况下修改其他窗体中的参数或者选项。

form.showDialog()方法打开的窗体被称作模式窗体。这种模式窗体在被关闭之前,用户是不能对其他窗体进行操作的。换句话说,只有完成了模式窗体要求我们进行的操作之后我们才能进行其他的操作。模式窗体能够让我们的程序操作流程更加清晰,操作顺序不容易被打乱。

我想的是showdialog 把原窗体阻塞了导致BeginReceive函数执行不了了,后来改成show方法后还是不行,在网上找到了这篇文章大体可以解释原因     https://www.cnblogs.com/ITyouxiang1994/p/4220895.html

1) 打开窗口代码:

  1. void openNewForm()  
  2. {  
  3.     Form2 newForm = new Form2();  
  4.     newForm.ShowDialog();  
  5. }
  6.  

 

(2) 线程入口函数

  1. //线程入口函数  
  2. void _threadProc()  
  3. {  
  4.     //定义一个委托实例,该实例执行打开窗口代码  
  5.     MethodInvoker mi = new MethodInvoker(openNewForm);  
  6.     BeginInvoke(mi);  
  7.   
  8.     //如果没有阻塞的话,该段代码应该可执行  
  9.     Console.WriteLine("新打开的窗口没有阻塞之后的执行");  
  10.     Console.ReadLine();  
  11. }  

 

(3) 创建,并执行线程

  1. Thread newThread = new Thread(new ThreadStart(_threadProc));  
  2. newThread.Start(); 

用异步委托的方式可以完美解决这个问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值