首页 > 代码库 > c#多线程2

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";                                   }));                            }        }

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

 

其实呢最后就是:

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); }