| 问题描述:当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决
 一个主线程来创建界面,使用一个子线程来执行程序并更新主界面
 这样就不会出现卡死的现像了
 这肯定是没有问题的,
 但是为什么在使用的过程中一样会有很多地方会出现卡死呢,而且有用户跟我说是我的Httphelper类的问题,其实不是,而且我再次声明我的Httphelper类跟多线程并没有关系。不要在诬赖我了哦。
 这个问题其实也困或了我很久,但是今天终于解决了,而且我发现很多人有这样的问题,所以我分享一个例子方便大家参考吧。
 先来看看我的界面
 <ignore_js_op>
   当我单击
 开始执行后
 <ignore_js_op>
    这个时候界面是不会卡死的,
 只是数据在不断的更新
 下面看看我的代码
  
 usingSystem;  
 usingSystem.Collections.Generic;  
 usingSystem.ComponentModel;  
 usingSystem.Data;  
 usingSystem.Drawing;  
 usingSystem.Linq;  
 usingSystem.Text;  
 usingSystem.Windows.Forms;  
 usingSystem.Threading; 
    
  
 namespaceWindowsFormsApplication3  
 {  
     publicpartialclassForm1 : Form  
     {  
         publicForm1()  
         {  
             InitializeComponent();  
         }  
           
         publicdelegatevoidUpdateTxt(stringmsg);  
           
         publicUpdateTxt updateTxt; 
    
  
           
         publicvoidUpdateTxtMethod(stringmsg)  
         {  
             richTextBox1.AppendText(msg + "\r\n");  
             richTextBox1.ScrollToCaret();  
         } 
    
  
           
         publicvoidThreadMethodTxt(intn)  
         {  
             this.BeginInvoke(updateTxt, "线程开始执行,执行"+ n + "次,每一秒执行一次");  
             for(inti = 0; i < n; i++)  
             {  
                 this.BeginInvoke(updateTxt, i.ToString());  
                   
                 Thread.Sleep(1000);  
             }  
             this.BeginInvoke(updateTxt, "线程结束");  
         }  
           
         privatevoidbutton1_Click(objectsender, EventArgs e)  
         {  
             Thread objThread = newThread(newThreadStart(delegate  
             {  
                 ThreadMethodTxt(Convert.ToInt32(textBox1.Text.Trim()));  
             }));  
             objThread.Start();  
         } 
    
  
         privatevoidForm1_Load_1(objectsender, EventArgs e)  
         {  
               
             updateTxt = newUpdateTxt(UpdateTxtMethod);  
         }  
     }  
 } 
    
 
  就这些代码,大家看注释应该就明白一点了, 
  主要是使用一个委托来更新界面的richTextBox1 
  这样写是肯定没有问题的,而且在我其它的更高级一点的例子里也是这么写的 
  
 C#多线程|匿名委托传参数|测试网站压力--升级版 
  
 http://www.sufeinet.com/thread-13-1-1.html 上面的文件大家可以做为参考 
  那问题现在那里呢,其实就出在这一句上 
  
   
  
    [C#]  
   纯文本查看 复制代码 
    
    
     
     
      
       
       | 
          01 
         |  
          
          this.BeginInvoke(updateTxt, "线程结束"); |  大家也许已经发现了,我是这样写的,而不是 
  
  这样来直接在子线程中使用, 
  我相信有很多同志都是这样写的,其实错就错在这里 
  如果直接使用 
  
  大家想一下应该就明白了, 
  
 updateTxt 是在主线程创建的,而我们在子线程中直接使用,运行的数据多了,就会出现卡死,这是界面信息堵死的原因, 
  所以就算是 
 委托 也不能直接在子线程中使用,而是要使用 
 BeginInvoke 方法来调用这个委托 
  这样才不会出现卡死的现像。 
    
 |