您好我正在尝试通过在按下按钮后显示一个延迟200毫秒的白色圆圈来欺骗大脑的一个小实验,然后在按住按钮3分钟后它显示没有延迟但我的图像框将不会响应to visible = true
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线程没有及时更新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
}
答案 1 :(得分:0)
Windows窗体仅绘制到屏幕,然后UI线程处于空闲状态 - 即它不在您的某个事件处理程序中。通过执行Thread.Sleep(),您不会给UI重绘的机会。
如果您拨打Update(),则会看到更改或致电Application.DoEvents()以获得控制权并重新绘制屏幕。
实际上,通过在UI线程上调用Thread.Sleep()来执行的操作是锁定UI,以便它不会更新或响应用户。您应该使用Timer来显示或隐藏图片框,以便UI响应()。