2011-07-31 23 views
-1

嗨,我试图通过显示一个白色的圆圈延迟200毫秒后按下按钮,然后3分钟后按下它显示没有延迟但我的形象框将不可见的回应=真图像框没有响应可见真

public void CircleDelay() 
    { 
     Thread.Sleep(200); 
     imgCircle.Visible = true; 
     Thread.Sleep(150); 
     imgCircle.Visible = false; 
    } 
    public void CircleNonDelay() 
    { 
     imgCircle.Visible = true; 
     Thread.Sleep(150); 
     imgCircle.Visible = false; 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     button1.Text = @"Click!"; 
     if(time == null) 
     { 
      time = DateTime.Now.ToString(); 
     } 

     if (DateTime.Now < Convert.ToDateTime(time).AddMinutes(3)) 
     { 
      // 
      CircleDelay(); 
     } 
     else 
     { 
      // 
      CircleNonDelay(); 
     } 

    } 
+0

什么是“图像盒”?你如何“扣紧”一个按钮? –

回答

0

问题是方法CircleDelay()CircleNonDelay(),UI线程没有得到任何时间更新了用户界面,并显示图像。一旦有机会,将图像可见性设置为false的代码已经被执行,这就是为什么你没有看到图像。

考虑以下代码

public void CircleNonDelay() 
    { 
     //UI thread sets the visibility to true 
     imgCircle.Visible = true; 
     //then UI thread sleeps for 150 ms (note the UI thread haven't updated the UI yet because it will do that once it is free from tasks assigned to it) 
     Thread.Sleep(150); 
     //UI thread sets visibility to false again 
     imgCircle.Visible = false; 
    } 

所以一旦UI线程获取免费的,你已经设置的知名度,false和同样是与其他方法的问题

你应该做这个

public void CircleNonDelay() 
    { 
     imgCircle.Visible = true; 
     // start a background worker or timer which will raise an event after 150 ms 
     //and call imgCircle.Visible = false; inside that event 
    } 
+0

非常感谢。 –

0

Windows窗体只绘制到屏幕上,然后UI线程处于空闲状态 - 即它不在您的某个事件处理程序中。通过执行Thread.Sleep(),您不会为UI重绘机会。

如果您打电话给Update(),您将看到更改或致电Application.DoEvents()以生成控件并让屏幕重新绘制。

实际上,通过在您的UI线程上调用Thread.Sleep()来锁定用户界面,以便它不会更新或响应用户。您应该使用Timer来显示或隐藏图片框,以便UI响应()。