【问题标题】:Why does a function not run procedurally [duplicate]为什么函数不能按程序运行[重复]
【发布时间】: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 之前返回。它没有。

标签: c# wpf


【解决方案1】:

它确实在同一个线程上同步运行,但 UI 线程不能同时休眠和隐藏/显示TextBox

一个线程不能同时做两件事。

【讨论】:

  • 我想他想知道为什么MyTextBox.Visibility = Visibility.Visible; 不显示文本框并刷新这一行中的 gui。我认为这个问题解决了这个话题:stackoverflow.com/questions/2341731/…
  • 设置属性不会导致 UI 立即重新渲染。
  • 我不是要求 UI 线程同时做两件事 - UI 线程应该在线程休眠之前首先设置可见性属性。还是因为 UI 图形仅在 UI 线程空闲或完成处理逻辑时才被渲染/刷新?如果是这样的话,UI线程有两部分:首先它处理逻辑然后渲染图形?
  • 渲染发生在专用渲染线程上。 WPF 中没有立即渲染模式。因此,如前所述,设置 Visibility 不会导致 UI 立即重新渲染。它最终会被渲染,但不是在你睡觉和阻塞之前。
  • 我以为渲染是UI线程的一部分,所以UI线程不处理渲染。我可以访问渲染线程并强制它更新吗?
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2020-11-09
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多