sleep到底怎么执行的呢?

dzone12345 吉林大学 学生  2017-12-07 03:24:12
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "开始";
button1.Enabled = false;
Thread.Sleep(3000);
textBox2.Text = "停止";
button1.Enabled = true;
}
按下button1后,button1变成灰色,textbox1 没有显示,而是到sleep结束后textbox1 和textbox2 同时显示,请问这个怎么回事,到底sleep怎么执行的呢?
...全文
164 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xuzuning 2017-12-07
1、Sleep 是挂起当前线程,不能及时响应控件的变化,这是再正常不过的事情了 2、button1_Click 是事件响应,他是在子线程中执行的(你可查看线程号来证实这一点) 3、楼上说的阻塞了主线程,这也没错,因为事件响应本身就是和主线程串行运行的 4、由于事件响应程序中断了主线程的执行,所以如果事件响应程序迟迟不归的话,界面就会出现假死的现象 为了解决这个问题,C# 提供了 Application.DoEvents() 方法(vs解释说:处理当前在消息队列中的所有 Windows 消息),以使界面控件得以响应事件
  • 打赏
  • 举报
回复
依然冷暖 2017-12-07
引用 7 楼 dzone12345的回复:
就是说,textbox1运行了,还没有显示出来,由于使用了sleep,就整个都阻塞了,到sleep结束 了,textbox2的内容显示出来了,textbox1的也显示出来,是吗??
明明是在说sleep是挂起线程不再占用CPU时间片 那就是程序根本不执行了过了3s才开始执行
  • 打赏
  • 举报
回复
dzone12345 2017-12-07
就是说,textbox1运行了,还没有显示出来,由于使用了sleep,就整个都阻塞了,到sleep结束 了,textbox2的内容显示出来了,textbox1的也显示出来,是吗??
  • 打赏
  • 举报
回复
正怒月神 2017-12-07
归根结底,还是 thread.sleep会阻塞线程。 你用下面的代码就可以了 private void button1_Click(object sender, EventArgs e) { this.textBox1.Invoke(new Action(() => { this.textBox1.Text = "1"; })); this.textBox2.Invoke(new Action(async () => { await Task.Delay(2000); this.textBox2.Text = "2"; })); }
  • 打赏
  • 举报
回复
xian_wwq 2017-12-07
如果要实现某个操作一定延迟后生效, 就不能把操作放在主线程中, 起个新的线程, 通过委托来更新UI, 这样就不会出现软件无响应或卡顿
  • 打赏
  • 举报
回复
正怒月神 2017-12-07
其实,我觉得你应该在控制台引用程序来执行,更直观一点。 static void Main(string[] args) { Console.WriteLine(1); Thread.Sleep(1000); Console.WriteLine(2); Console.ReadLine(); } 这样就会先显示1,在显示2了。 而winform有个ui线程被阻塞的关系。所以嘛,你会觉得3秒后一起显示。
  • 打赏
  • 举报
回复
wanghui0380 2017-12-07
sleep就是阻塞当前线程 你在UI里写的东西,自然他就是阻塞当前UI
  • 打赏
  • 举报
回复
正怒月神 2017-12-07
sleep 阻塞了主线程。也就是你当前界面的运行被阻塞了,3秒后,才开始执行之后的代码。
  • 打赏
  • 举报
回复
_jiasong 2017-12-07

Thread.Sleep(3000);//主线程停3秒,3秒后代码继续执行
你的textBox1没有显示是其他的问题和Sleep没关系
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-12-07 03:24
社区公告

让您成为最强悍的C#开发者