自己写了个winform界面程序,过程中出现了一个问题。客户端在登录成功后接受不到服务器的消息了。排查了很多问题,发现是新窗体打开的才导致接收不到消息。
上网查解决办法,第一个找到的是form.show 和form.showdialog区别,
form.show()方法打开的窗体被称作非模式窗体。这种非模式窗体及时还用户还没有处理,用户也可以切换到其他的窗体进行其他的操作。非模式窗体让用户的操作更加灵活便捷。用户可以方便的在不关闭非模式窗体的情况下修改其他窗体中的参数或者选项。
form.showDialog()方法打开的窗体被称作模式窗体。这种模式窗体在被关闭之前,用户是不能对其他窗体进行操作的。换句话说,只有完成了模式窗体要求我们进行的操作之后我们才能进行其他的操作。模式窗体能够让我们的程序操作流程更加清晰,操作顺序不容易被打乱。
我想的是showdialog 把原窗体阻塞了导致BeginReceive函数执行不了了,后来改成show方法后还是不行,在网上找到了这篇文章大体可以解释原因 https://www.cnblogs.com/ITyouxiang1994/p/4220895.html
1) 打开窗口代码:
- void openNewForm()
- {
- Form2 newForm = new Form2();
- newForm.ShowDialog();
- }
(2) 线程入口函数
- //线程入口函数
- void _threadProc()
- {
- //定义一个委托实例,该实例执行打开窗口代码
- MethodInvoker mi = new MethodInvoker(openNewForm);
- BeginInvoke(mi);
- //如果没有阻塞的话,该段代码应该可执行
- Console.WriteLine("新打开的窗口没有阻塞之后的执行");
- Console.ReadLine();
- }
(3) 创建,并执行线程
- Thread newThread = new Thread(new ThreadStart(_threadProc));
- newThread.Start();
用异步委托的方式可以完美解决这个问题。