首页 新闻 会员 周边 捐助

关于Socket通讯连接服务器界面卡的问题

0
悬赏园豆:10 [已解决问题] 解决于 2013-10-23 15:19

C#写了一个客户端程序,用来连接服务器。当这个服务器是存在的时候,很容易就连接上了。可是,当服务器不存在的时候,发起连接的那4,5秒钟,软件一直都卡在那了,界面完全卡死,一直是等待连接状态,4,5秒后界面自动就不卡了。我试着开启线程来做,可是程序会推出。有什么好的办法呢。有代码也行,提供思路也好。谢谢。

名字还没想好的主页 名字还没想好 | 初学一级 | 园豆:159
提问于:2013-10-08 15:33
< >
分享
最佳答案
0

首先给你解释一下两个问题的原因吧:

  1. 鼠标事件也是在UI线程中进行的,在UI线程处理socket操作的话,socket连接的时候把ui线程阻塞了,自然界面无响应了。
  2. 非UI线程不能操作UI控件,这个是.Net的一个限制。 当你启新的socket线程操作界面时,会因为在UI线程访问界面而抛异常导致程序退出。 

至于解决方法,网上的例子很多,给你找了篇文章参考下:http://blog.csdn.net/fhbcn/article/details/6167504

收获园豆:10
天方 | 大侠五级 |园豆:5432 | 2013-10-09 00:06

谢谢你的回答。例子很精彩,学习了,有时间会仔细看看。

名字还没想好 | 园豆:159 (初学一级) | 2013-10-09 10:13
其他回答(2)
0

这个问题与Socket通讯无关,你要面对的问题就是一个耗时的操作,如何避免前端界面被锁死。

通常的解决方案都是使用线程,但线程操作UI时需要特别的代码。如果不熟悉这方面的代码,

建议你先使用Backgroundworker这个组件试试,把耗时的操作写在DoWork中,注意在Dowork时,

尽量不要访问可视化控件。

爱编程的大叔 | 园豆:30844 (高人七级) | 2013-10-08 16:12

谢谢你的回答。我是用线程做的。我做的是开启两个线程,一个是发起连接(之前把这个线程给去掉了,但是仍然没有解决掉问题,还是加上来了),一个是用于接收服务器端的消息,其实他有一个先后执行的问题,但是程序却是将两个线程同时执行的。所以我觉得是控制线程的执行顺序。你说的Backgroundworker应该能解决掉这个问题,但是能不能用纯代码的方式来解决呢,求指教。

支持(0) 反对(0) 名字还没想好 | 园豆:159 (初学一级) | 2013-10-09 09:58

@FreeEdgar: 

上帝啊,接收消息是不需要用线程的啊,服务器返回消息是Event,你响应事件就行了啊。

类似这样的,甚至不需要用到线程或是Backgroundworker,

就是用异步方式发出请求,然后等待事件发生再处理就行了,界面一直是活动的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2013-10-10 15:28

@爱编程的大叔:接收消息不用线程怎么行,客户端是一直在不断接收服务端的消息,那不是卡死了。如果是异步的话就不需要等待了,异步的就是只管发不管对方是否收到回应。但还是要进行连接吧,要连接它也会卡的吧。异步我不是很熟悉,这是我自己的理解。有错误还希望你能指正。

支持(0) 反对(0) 名字还没想好 | 园豆:159 (初学一级) | 2013-10-12 16:10
0

使用异步Socket,参考博文:Socket异步编程-之客户器端

dudu | 园豆:29732 (高人七级) | 2013-10-09 11:20

谢谢你的回答,例子很好,学习了。

支持(0) 反对(0) 名字还没想好 | 园豆:159 (初学一级) | 2013-10-12 15:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册