解决方案 »

  1.   

    label1.Text = "hello";
    Application.DoEvents();
                Thread.Sleep(2000);
                label1.Text = "world";
      

  2.   

    楼上的正解。主要是
    Application.DoEvents();
      

  3.   

    这个确实可以,但在WPF中好像没有这个方法
      

  4.   

    public static class DispatcherHelper   
     {   
         [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]   
         public static void DoEvents()   
         {   
             DispatcherFrame frame = new DispatcherFrame();   
             Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame);   
             try { Dispatcher.PushFrame(frame); }   
             catch (InvalidOperationException) { }   
         }   
         private static object ExitFrames(object frame)   
         {   
             ((DispatcherFrame)frame).Continue = false;   
             return null;   
         }   
     }  
      

  5.   

    不用多线程这么麻烦。
    用定时器就是可以了,第一次赋值之后,启动一个2秒的定时器,定时器触发的时候修改Label。直接在主线程里Sleep,由于无法刷新,第一次赋值的内容是看不到的。
      

  6.   


    Thread th = new Thread(() =>
                                {
                                    this.Invoke(new MethodInvoker(() => { label1.Text = "Hello"; }));
                                    Thread.Sleep(5000);
                                    this.Invoke(new MethodInvoker(() => { label1.Text = "World"; }));
                                });
    th.Start();
      

  7.   

    这段代码我在网上也搜到过,但用的时候会提示未能找到类型或命名空间名称“DispatcherFrame”(是否缺少 using 指令或程序集引用?)不知道该添加哪个命名空间?
      

  8.   

    Application.DoEvents(); 让界面显示下
      

  9.   

    Web里面可以用前台的js加定时器处理,后台的话还真没碰到过
      

  10.   

    首先时间对象也是一个线程,
    所以可以用线程+委托:
            Thread aa;
            public void BtnControl()
            {
                Thread.Sleep(2000);
                label1.Invoke(new MethodInvoker(delegate
                {
                    label1.Text = "bbb";
                }));
                aa.Abort();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = "aaa";
                aa = new Thread(new ThreadStart(BtnControl));
                aa.Start();
            }
      

  11.   

    楼主的那段代码应该曾被多少人梦想过啊~~我当年也幻想能这样做的。
    你应该理解,在事件改变Label的值与界面重绘是在同一个线程,就是改变值跟重绘是顺序来做的(这个过程界面会卡住”无法响应“),最后等到事件结束了才将最后的结果绘制出来。所以要实现这样的效果,思路应该是赋值Label的值,释放控件线程让它重绘。在其他线程等待2s后,再触发个事件为Label赋第二次值。#3,#7,#9,#13楼应该都能实现你要的效果吧。
    #13楼简化:
    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text = "Hello";
        new Thread(delegate()
        {
            Thread.Sleep(2000);
            label1.BeginInvoke(new MethodInvoker(() =>
            {
                label1.Text = "World";
            }));
        }).Start();
    }