c#多线程2

 for (int i = 0; i < 100000; i++)
 {
                textBox1.Text += i + "   " + "\n"; 
                Thread.Sleep(1000);
 }

  这么一段代码,放在程序里的那简直页面会卡出蛇精病,怎么办呢,用多线程试试

 private void button1_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(er));
            t.Start();
          richTextBox1.AppendText("eee33");
            button1.Text = "...";
}
 private void er()
        {
    
      this.Invoke(new Action(() =>
               {
         for (int i = 0; i < 100000; i++)
            {
                   textBox1.Text += i + "   " + "\n";
                   Thread.Sleep(1000);
            }
                }));
        }                                        

  页面:呵呵呵,愚蠢人类,卡死你了吧。

    窝:妈蛋,跟你拼了!!

   绞尽脑汁中。。。

 private void er()
        {           
       for (int i = 0; i < 100000; i++)
            {
                this.Invoke(new Action(() =>
                {
                    textBox1.Text += i + "   " + "\n";
                    Thread.Sleep(1000);
                }));
                Thread.Sleep(100);
            }
        }                 

  嗯,感觉好了一些,但是好像哪里还是不对的样纸。。。

 

改成这样:

 private void er()
        {

           
       for (int i = 0; i < 100000; i++)
            {
                this.Invoke(new Action(() =>
                {
                    textBox1.Text += i + "   " + "\n";
                    Thread.Sleep(5000);
                }));
                Thread.Sleep(100);
            }
        }        

  终于发现了它总是一顿一顿的,让你干捉急,然后动用我那脑容量爆棚的大脑,哦,原因是因为this.Invoke是执行在主程序上,所以它一卡,大家都不会有幸福的生活!如果你的代码就是要用这么长时间把数据加载到页面上,呃,这个吗。。这个吗。。。好吧,我们来看另外一种情况,就是 Thread.Sleep(5000);是在做些一些逻辑处理啦,数据库交互啦之类的东东,跟页面上的控件毛线关系都没有,这个时候我们可以这样:

  private void er()
        {
            for (int i = 0; i < 100000; i++)
            {
                Thread.Sleep(5000);
                this.Invoke(new Action(() =>
                {
                    textBox1.Text += i + "   " + "\n";
                   
                }));
                
            }
        }

  把跟控件没关系的代码从 this.Invoke中移出。机智到没朋友啊,有木有!!!哈哈哈哈!!!但是一想,如果这个代码和控件有有着不可告人的秘密肿么办?

 private void erq()
        {
            for (int i = 0; i < 100000; i++)
            {
                int m = 0;
                for (int j = 5; j > 0; j--)
                {
                    m = 100 - i;
                    Thread.Sleep(1000);

                }
                this.Invoke(new Action(() =>
                {
                    textBox1.Text += m + "   " + "\n";
                   
                }));
                
            }
        }

  没有异常!好了,窝只能帮你这么多了,页面

c#多线程2

 

其实呢最后就是:

for (int i = 0; i < 100000; i++)
 {
                textBox1.Text += i + "   " + "\n"; 
                Thread.Sleep(1000);
 }

 转为:

for (int i = 0; i < 100000; i++)
{
 this.Invoke(new Action(() =>
 {
     textBox1.Text += m + " " + "\n";

}));
Thread.Sleep(1000);
 }

  

 

c#多线程2,布布扣,bubuko.com

c#多线程2

上一篇:全面整理的C++面试题


下一篇:MESI协议