我最近在做一个类似QQ聊天的软件,遇到了点问题。在QQ主窗体中打开一个聊天子窗体,在这个子窗体中向服务器发送数据,服务器收到数据后向客户端回发,客户端将收到的数据放到一个缓冲区中。在主窗体中有一个timer控件每隔一段时间读取这个缓冲区的数据,然后将处理后的数据放到一个静态变量中(这个变量在一个公共类中定义,用于窗体间共享数据)。
    在刚刚打开的聊天子窗体中要用到这个静态变量的值,所以发送完数据后必须要阻塞,直到这个静态变量的值不为空才执行后面代码。现在问题来了,我不管是用Thread.Sleep()函数让这个线程睡觉还是用while循环一直读取这个变量直到不为空时跳出循环都不行。我调试过,采用这两种方式后主窗体中的timer控件就停止了,也就是这个变量没被写入,while也处于死循环状态,不知道什么原因?但我采用弹出对话框的方法就可以成功读出变量值(即MessageBox.Show("XXXX");让其发送数据后弹出一个对话框)。
    各位高手谁以前碰到过这种问题,求解释,感激不尽~
    PS:由于代码太乱,所有请谅解无法发上代码,但原理也就是上面说的那样。应该不是数据的问题

解决方案 »

  1.   

    winform UI线程中用 Thread.Sleep() 会造成这种情况...........
    最好详细的看看winform的后台线程示例
      

  2.   

    http://topic.csdn.net/u/20110317/22/47f27c26-e691-4fa1-88ee-664bdf98d6fb.html
      

  3.   


    http://apps.hi.baidu.com/share/detail/23346823
    自己百度吧,提高快你这样问连个代码都没有,没法回答
      

  4.   

    已经解决了哈,因为我用的timer控件是Winform的timer控件,其运行和主窗体是在同一个线程中的,所以当循环等待数据写入到静态变量时,timer控件当然处于阻塞状态了,把这个timer控件换成System.Timer即可,这个类生成的计时变量和主窗体是不在同一个线程的。OK,结贴!