Thread.Sleep(300)无法正常工作

Rob*_*Rob 1 c# multithreading sleep winforms

我希望它执行代码的第一部分,然后使pictureBox可见,暂停3秒,隐藏pictureBox并执行其余代码:

// first part of the code here
pb_elvisSherlock.Visible = true;
Thread.Sleep(300);
pb_elvisSherlock.Visible = false;
// rest of the code here
Run Code Online (Sandbox Code Playgroud)

但它执行整个代码块,然后暂停.有什么想法怎么办?

谢谢!

小智 11

如果您尝试PictureBox显示3秒钟,您可能希望应用程序在此期间保持响应.因此使用Thread.Sleep不是一个好主意,因为您的GUI线程在睡眠时不会处理消息.

一个更好的选择是设置一个System.Windows.Forms.Timer3000毫秒,隐藏PictureBox3秒后不屏蔽你的GUI.

例如,像这样:

pb.Visible = true;
var timer = new Timer();
timer.Tick += () => { pb.Visible = false; timer.Stop(); };
timer.Interval = 3000;
timer.Start();
Run Code Online (Sandbox Code Playgroud)


jga*_*fin 5

pb_elvisSherlock.Visible = true;
Application.DoEvents(); //let the app show the picturebox
Thread.Sleep(3000);
pb_elvisSherlock.Visible = false;
Run Code Online (Sandbox Code Playgroud)

问题是,在暂停GUI线程之前,不要给消息循环提供显示图片框的机会.Application.DoEvents()解决这个问题

请注意,Thread.Sleep在GUI线程上使用将使绘画冻结(尝试在Sleep活动时在应用程序上移动窗口).

你应该做这样的事情:

pb_elvisSherlock.Visible = true;
int counter = 0;
while (counter < 30)
{
  Application.DoEvents(); 
  Thread.Sleep(100);
  ++counter;
}
pb_elvisSherlock.Visible = false;
Run Code Online (Sandbox Code Playgroud)

它仍然是一种黑客攻击,但窗口将被重新绘制并响应它应该.

更新2

好.DoEvents似乎有点像黑客.(感谢您的评论).

如果图片框是一种唠叨的屏幕做这样的事情:

备选方案1

  1. 创建仅包含图片框的新表单(不要在该表单上使用边框).
  2. Close在三秒钟后调用的表单中添加一个计时器
  3. 调用'myNagForm.DoModal()'

该解决方案可以防止用户以"正常"形式执行任何操作,同时可以看到nagform.

备选方案2

  1. 创建后台工作者,请参见此处:http://dotnetperls.com/backgroundworker
  2. 将您的图片框及其后执行的代码移动到后台工作程序方法.