一个按钮中,
for (int i = 0; i < 1000; i++)
                {
                    Console.WriteLine(i);
                    Thread.Sleep(100);
                    this.Text = string.Format("{0}/{1}",i,1000);
                }如果这样写程序会卡死,请问,怎么更新进度,谢谢.

解决方案 »

  1. 试试this.Text = string.Format("{0},{1}",i,1000);
     
      

  2. 你用了多线程 你让它休息了一会当然卡死  Thread.Sleep(100);
     
      

  3. 胡扯,要是不会就少说多看,免得给别人造成困扰。
    首先楼主要有线程的概念,你这段代码是在主线程中执行的,同时主线程也是UI线程,这样在这段代码执行完之前主线程是没有机会去刷新UI的。两个办法
    1,工作放到主线程之外的线程里面做,然后通过事件,或者轮询的方式更新完成进度。
    2,另一种方式就是在主线程里面做,每次循环之后都做一次DoEvents,这样给主线程一个机会去刷新UI。个人推荐第一种方式,因为这才是正规的做法。第二种方式其实是一种偷懒的做法,因为工作还是在主线程里面做,所以在工作结束之前主线程都会繁忙,对于UI来说,这种做法很不好。
      

  4. 采用多线程或者直接用BackgroundWorker 
    http://blog.csdn.net/kenkao/article/details/5688557
      

  5. 循环里面加上 Application.DoEvents();试试
      

  6. this.Invoke((EventHandler)delegate
                    {
                        this.Text = string.Format("{0}/{1}",i,1000);
                    });
      

  7. 把你上面的buttonClick事件里面的代码提取成一个方法method(),然后用线程去执行!Thread th = new Thread(delegate(){
                            method();
                        });
                        th.Start();
      

  8. 有一个控件叫timer,用它就可以了
      

  9. timer实际上也是一个线程,反对新手使用timer控件或者timer类!这样不利于新手成长!
      

  10. Thread.Sleep(100);  循环1000次
    不死么....为何要用Thread.Sleep(100); 这个呢?
      

  11. 这就是传统的窗体应用程序经常出现的问题,UI主线程忙的时候,是不会刷新窗体的,也就是你看到的假死状态。解决办法
    1、窗体this.Refresh();强制重新绘制
    2、backgroundworker组件
    3、委托一个新线程去处理循环体 public void test()
            {
                int i=0;
                while (i<100000)
                {
                    this.Invoke
                        (
                        (MethodInvoker)delegate()
                        {
                            label1.Text = i.ToString();
                        }
                        );
                    i += 100;
                    
                }
            }
    private void button1_Click(object sender, EventArgs e)
            {
                i = 0;
                Thread th = new Thread((ThreadStart)delegate()
                {
                    test();
                });
                th.Start();
               
            }
      

  12. 一楼不要误导人,你从那儿看出他用多线程了
    不要一看到Thread就是多线程
      

  13. Thread.Sleep()阻塞当前线程!1楼,对你表示无语
      

类似问题 »