• c#多线程2


     for (int i = 0; i < 100000; i++)
     {
                    textBox1.Text += i + "   " + "
    "; 
                    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 + "   " + "
    ";
                       Thread.Sleep(1000);
                }
                    }));
            }                                        
    

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

        窝:妈蛋,跟你拼了!!

       绞尽脑汁中。。。

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

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

    改成这样:

     private void er()
            {
    
               
           for (int i = 0; i < 100000; i++)
                {
                    this.Invoke(new Action(() =>
                    {
                        textBox1.Text += i + "   " + "
    ";
                        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 + "   " + "
    ";
                       
                    }));
                    
                }
            }
    

      把跟控件没关系的代码从 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 + "   " + "
    ";
                       
                    }));
                    
                }
            }
    

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

    其实呢最后就是:

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

     转为:

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

      还有一种方法可以使用

    for (int i = 0; i < 10000; i++)
    {   textBox1.Text += i ;

    Application.DoEvents();
    }

     

    
    
  • 相关阅读:
    Day10
    Python pyspider 安装与开发
    深入理解ES6之《块级作用域绑定》
    深入理解ES6之《扩展对象》
    这些特效对于学习前端我们很有用
    算法之旅 | 选择排序法
    JavaScript读取剪贴板中的表格生成图片
    深入理解ES6之《ES7》
    深入理解ES6之《用模块封装代码》
    php://input,$_POST,$HTTP_RAW_POST_DATA区别
  • 原文地址:https://www.cnblogs.com/paidaxing/p/3807591.html
Copyright © 2020-2023  润新知