【发布时间】:2017-12-19 10:50:04
【问题描述】:
为什么函数不按程序运行?我希望下面的代码会首先显示一个 TextBox,然后空闲 3 秒,然后隐藏 TextBox,但应用程序只是休眠 3 秒而不显示 >文本框
public Main()
{
MyTextBox.Visibility = Visibility.Visible;
Thread.Sleep(3000);
MyTextBox.Visibility = Visibility.Hidden;
}
[编辑 1]
我真的找不到关于为什么在文本框可见后线程没有休眠的解释。在上一行 MyTextBox.Visibility 完成运行之前,不应启动 Thread.Sleep。因此,我的问题是:为什么语句不按程序/顺序运行?
[编辑 2]
我可以理解反对票,但我无法从“重复”问题中找到解释。 UI 线程应该在 Thread.Sleep(3000) 之前呈现我的 TextBox.Visibility,但事实并非如此。
我最初对 UI 线程应该怎么走的想法:
Main() -> 初始化 UI 控件 -> 运行构造函数 -> 设置 TextBox.Visibilily 属性(可见)-> 渲染文本框在 GUI 上可见-> Thread.Sleep(3000) -> 设置 TextBox.Visibility 属性(隐藏) -> 将文本框隐藏在 GUI 上
但在实践中,线程看起来更像如下:
Main() -> 初始化 UI 控件 -> 运行构造函数 -> 设置 TextBox.Visibilily 属性(可见)-> 设置 TextBox.Visibilily 属性 (隐藏)-> Thread.Sleep(3000)-> 渲染文本框在 GUI 上可见-> 渲染 隐藏在 GUI 上的文本框
【问题讨论】:
-
因为 Thread.Sleep 不可避免地阻塞了 UI 线程。这个问题在这里被问过太多次了。
-
因为
Thread.Sleep使 GUI 线程休眠 3 秒,因此您的应用程序冻结 -
@KMC 你应该让用户计时器打勾
-
但它应该在冻结我的应用程序之前显示我的文本框
-
这将要求方法在您将属性设置为 Visibility.Visible 之后但在调用 Thread.Sleep 之前返回。它没有。