本人真正的小白,但渴望学习,这一个月一直在看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)语句来解决这个问题。