[求解]关于Thread.Sleep()引起的消息处理问题?
本人真正的小白,但渴望学习,这一个月一直在看C#的书,现在手头在看的是C#图解教程第4版,在看到异步编程的GUI的P416-P418的例子时,对书中的一个问题感到十分困惑,查了两天了,都没解决。求大神们救救我这个希望学习的小白了
,脑子被这里搞混了,瞬间学习不下去了。问题是这样的,贴上窗口初始状态图片和代码。

private void btnDoStuff_Click(object sender,RoutedEventArgs e) // btnDoStuff是按钮的名字
{
btnDoStuff.IsEnabled = false;
lblStatus.Content = "Doing Stuff"; //lblStatus是标签的名字
//希望实现的是点击按钮后,按钮变成禁用状态,同时将文本标签的内容改为“Doing Stuff”
Thread.Sleep(4000);
lblStatus.Content = "Not Doing Anything";
btnDoStuff.IsEnabled = true;
//休眠4S后,按钮恢复可用状态,同时将文本标签内容改为“Not Doing Anything"。
}
实际执行后点击按钮后,
1:卡死4秒,
2:然后标签马上变成了"Not Doing Anything",按钮是可用状态。
问题是为什么不会是
1:”标签内容先变成Doing Stuff,按钮状态变为禁用”,
2:然后再卡死4秒,
3:标签变成了"Not Doing Anything",按钮变回可用状态。
书上解释了消息的处理,有句原话是:“但在处理程序本身退出(即休眠4S并退出)之前,这些消息都无法执行。然后所有的行为都发生了,但速度太快肉眼根本看不见。”
书上的意思是对于实际情况,是先休眠了4S?然后再一下子执行了”标签内容先变成Doing Stuff,按钮状态变为禁用”,标签再变成"Not Doing Anything",按钮变回可用状态?
这个执行顺序是什么原因啊?
很僵硬啊,对这个消息处理瞬间懵逼,书上把Thread.Sleep(4000)改成了await Task.Delay(4000)语句来解决这个问题。
,脑子被这里搞混了,瞬间学习不下去了。问题是这样的,贴上窗口初始状态图片和代码。
private void btnDoStuff_Click(object sender,RoutedEventArgs e) // btnDoStuff是按钮的名字
{
btnDoStuff.IsEnabled = false;
lblStatus.Content = "Doing Stuff"; //lblStatus是标签的名字
//希望实现的是点击按钮后,按钮变成禁用状态,同时将文本标签的内容改为“Doing Stuff”
Thread.Sleep(4000);
lblStatus.Content = "Not Doing Anything";
btnDoStuff.IsEnabled = true;
//休眠4S后,按钮恢复可用状态,同时将文本标签内容改为“Not Doing Anything"。
}
实际执行后点击按钮后,
1:卡死4秒,
2:然后标签马上变成了"Not Doing Anything",按钮是可用状态。
问题是为什么不会是
1:”标签内容先变成Doing Stuff,按钮状态变为禁用”,
2:然后再卡死4秒,
3:标签变成了"Not Doing Anything",按钮变回可用状态。
书上解释了消息的处理,有句原话是:“但在处理程序本身退出(即休眠4S并退出)之前,这些消息都无法执行。然后所有的行为都发生了,但速度太快肉眼根本看不见。”
书上的意思是对于实际情况,是先休眠了4S?然后再一下子执行了”标签内容先变成Doing Stuff,按钮状态变为禁用”,标签再变成"Not Doing Anything",按钮变回可用状态?
这个执行顺序是什么原因啊?
很僵硬啊,对这个消息处理瞬间懵逼,书上把Thread.Sleep(4000)改成了await Task.Delay(4000)语句来解决这个问题。
...全文
相关推荐
Java Thread之Sleep()使用方法总结
主要介绍了Java Thread之Sleep()使用方法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
python time.sleep()是睡眠线程还是进程
主要介绍了python time.sleep()是睡眠线程还是进程,通过实例代码给大家介绍了Python Sleep休眠函数 ,需要的朋友可以参考下
JAVA线程sleep()和wait()详解及实例
主要介绍了JAVA线程sleep()和wait()详解及实例的相关资料,探讨一下sleep()和wait()方法的区别和实现机制,需要的朋友可以参考下
关于Thread.Sleep(0)的说明
Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下。详情请见文档。
java sleep()和wait()
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行.wait()和它的区别请查看下载。


