2013-02-28 19 views
0

所以我读了下面的线程Why use suspendLayout。所以我想我会创建一个小例子来给我一个概念证明。但是,它不工作。我只看到“第二部分完成”。请指教。suspendlayout和resumelayout之间的区别

private void button1_Click(object sender, EventArgs e) 
    { 
     this.SuspendLayout(); 
     lblStatus.Text = "Part 1 completed"; 
     this.ResumeLayout(); 

     System.Threading.Thread.Sleep(5000); 

     this.SuspendLayout(); 
     lblStatus.Text = "Part 2 completed"; 
     this.ResumeLayout();    
    } 

回答

1

你已经从与Thread.Sleep()(例如过程WM_SETTEXT消息)执行阻塞UI线程,因此,以显示“已完成第1部分”它不能更新UI。它只能在UI线程恢复后才能刷新自己,到那时你已经要求它显示“Part 2 completed”

如果你想模拟改变文本框值之间的一段时间,你可以使用Timer。例如:

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SuspendLayout(); 
    label1.Text = "Part 1 completed"; 
    this.ResumeLayout(); 
    timer.Interval = 5000; 
    timer.Start(); 
} 

private void timer_Tick(object sender, EventArgs e) 
{ 
    timer.Stop(); 
    this.SuspendLayout(); 
    label1.Text = "Part 2 completed"; 
    this.ResumeLayout(); 
} 
+0

但我在睡觉前设置了标签? – Rod 2013-02-28 09:02:57

+0

设置标签实际上是向控件发送消息 - 如果你阻塞UI线程(使用Thread.Sleep),它不能处理该消息(WM_SETTEXT) – 2013-02-28 17:38:11

+0

有没有办法做到我试图做到以上? – Rod 2013-03-05 19:19:37