http://www.cnblogs.com/chenxizhang/archive/2011/09/10/2172994.html看看这个吧.. 超级不错的..while(true)这东西不是很好.相对异步来说...所以你这代码只能自己玩玩...

解决方案 »

  1.   

    那要在这里保持不间断的socket长连接性质的信息接收,应当怎样变通处理才好,用过时间控件,没有用
      

  2.   

    while(true)  
    在后面添加一个sleep吧 这样就不会死机了
      

  3.   

    在click方法里面while(true),这个会卡住,不会返回的,所以有问题的,
    正常会在click的方法里面新开一个线程,在新的线程里面去while(true)监听
      

  4.   

    你这..直接在主线程里while(true) 肯定不行啊..一般就算是要用while(true)..也是会开一个子线程,
      

  5.   

    不用加Sleep,因为Receive会阻塞线程,只需要把while(true)放到多线程里就可以了            Task.Factory.StartNew(new Action(() =>
                    {
                        while (true)
                        {
                            int receiveLength = Rcconnect.client.Receive(result);
                            listBox1.Items.Add(DateTime.Now + "  RecConext>" + Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength));
                        }
                    }));
      

  6.   

    大家都说的很清楚了,因为Receive是个同步方法,当没收到套接字对应主机的响应时会卡住线程,除了第一次Receive正确接收到消息后,你的线程就被死循环的第二次Receive卡住,后面的循环已经没有任何意义。
    而你用控制台,在第一次Receive的时候面临的是控制台的退出,因为程序没执行完成(即线程没退出),所以你此时卡住的是控制台的退出,并未将循环执行下去,因此让你错误的以为控制台是可以执行的。
    为什么用控制台的时候,往往都要加一句Console.ReadKey(); 就是为了阻止线程的结束,你这里的死循环起到了这个效果而已
      

  7.   

    方案1 查看关于线程内容,做个线程处理循环。
    方案2 查看异步SOCKET 。
      

  8.   

    这样不行,在线程中,控件不能直接调用,会报错的。改成这样
    Task.Factory.StartNew(new Action(() =>
    {
        while (true)
        {
            int receiveLength = Rcconnect.client.Receive(result);
            listBox1.Invoke((Action)(() =>
            {
                listBox1.Items.Add(DateTime.Now + "  RecConext>" + Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength));
            }));
        }
    }));
      

  9.   

    这样不行,在线程中,控件不能直接调用,会报错的。改成这样
    Task.Factory.StartNew(new Action(() =>
    {
        while (true)
        {
            int receiveLength = Rcconnect.client.Receive(result);
            listBox1.Invoke((Action)(() =>
            {
                listBox1.Items.Add(DateTime.Now + "  RecConext>" + Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength));
            }));
        }
    }));
    恩,失误,写漏了,没注意到有控件对象
      

  10.   

    while(true)这张弓不能缺了break这根弦,总原地转圈当然挂了.
      

  11.   

    死循环慎用
    要么不用,要么放到线程里去用,永远不要在主线程里while(true)
      

  12.   

    你这很明显啊!!无语
     while (true) 这个东西岂能是主线程使用的!!!这不是控制台啊亲!!
      

  13.   

    其实winform也没有死掉,逻辑还在正常执行,只不过界面卡死了而已
    你用控制台程序,也是逻辑在执行,但是不会再响应输入了
      

  14.   

    上面说的很对,while (true) 里面最好有个break;比如接收服务端数据超过规定时长,则推出;否则,真的是死里面啦。