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)
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
Close在三秒钟后调用的表单中添加一个计时器该解决方案可以防止用户以"正常"形式执行任何操作,同时可以看到nagform.
备选方案2