回 帖 发 新 帖 刷新版面

主题:小女子问问各位高手,(线程问题)

由于工作需要,写了两个网络程序,由于技术不精,有点问题,还请大家帮忙
情况说明:
1、有两个程序,一个客户端,一个服务器端,连接通两个程序。
2、客户端根据需要给服务器端程序发送数据(byte数组)
3、客户端接受到数据后,把数据分析出来放在服务器窗口的DataGridView里。
4、服务器每接受到一次数据,DataGridView更新一次。

服务器程序有两个线程,一个主线程(即窗口线程),一个子线程,子线程通过while(true)一直在等待客户端发送来是数据。

问题如下:
我用的VS2005,C#写的程序,在调试的时候,两个程序(客户端和服务器端)实现通信没有任何异常。
但是,当我运行两个exe文件的时候,客户端每发送一次数据给服务器程序,你都会看到DataGridView自动添加一行数据,当数据添加到DataGridView即将出现滚动条的时候,服务器窗口就要死掉,你怎么拖都拖不动窗口。(注意:DataGirdView没有出现滚动条的时候,不会死)
有人说,窗口死掉,应该是主线程的问题,但是我主线城没有死循环,只有子线城里有个死循环。

请高人指点:

回复列表 (共5个回复)

沙发

刷新用的什么方法?
问题应该出在datagridview刷新上

板凳

[quote]刷新用的什么方法?
问题应该出在datagridview刷新上[/quote]

楼上说的一点没错,晚上回去,和同事讨论到晚上两点,终于找个了灵感。
就是DataGridView更新出现问题

原来是DataGridView数据在跨线程更新的时候出现卡死

DataGridView是在主线程里创建的,但数据更新却是在子线程里更新的。所以导致数据时时更新卡死

通过委托来控制DataGridView的数据更新,这样就完全没有问题了,看来还是自己的技艺不精啊。还需要多学习。

但是还有一点想不通:为什么在编译环境下就没有问题呢????

3 楼

调试可能是你两个exe项目在同一解决方案下
所有启动现程都在一个进程中的原因吧
我也不清楚
不过我觉得如果你刷新不用重构而用表绑定的方式的话,应该也不会卡死
我没有2005环境

都是猜测

4 楼

更新数据的时候要在窗体线程中调用

5 楼

如果你注意看MSDN,你会注意到微软多次提到,不建议用非UI现成来更新窗体.他也提供了一个比较好的方法,用InvokeRequired来做判断.

我来回复

您尚未登录,请登录后再回复。点此登录或注册