[求解]关于Thread.Sleep()引起的消息处理问题?

SSClearn27 SSClearn27 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
本人真正的小白,但渴望学习,这一个月一直在看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)语句来解决这个问题。
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部
SSClearn27
C# 111,129 成员 642,538 内容