ProgressBar 在阻塞的 UI 线程中更新

2023-12-08

为什么ProgressBar会在理论上阻塞的UI线程中更新?

在简单的应用程序中,我有一个进度栏和一个标签。我在 UI 线程中运行一个耗时的方法,尝试更新 ProgressBar 和标签。这是not应该可以工作,因为 UI 线程被阻塞。但进度条正在更新!

直到我在表单上执行任何操作并且它冻结之前,ProgressBar 都会更新(标签不会更新)。

这是为什么?

示例代码(在表单上放置一个按钮、一个进度条和一个标签):

private void button1_Click(object sender, EventArgs e)
{
    while (true)
    {
        progressBar1.Value += 1;
        label1.Text += "1";
        Thread.Sleep(100);
    }
}

ProgressBar 正在更新,Label 没有更新。我的问题is not如何进行标签更新以及为什么 ProgressBaris更新。我确实了解线程、DoEvents、async/await,但这不是答案。


我认为如果不拆卸一些 Windows 就很难完全回答这个问题,这对我来说现在的工作量太大了。

但基本上,当您在 WinForms ProgressBar 控件上设置 .Value 时,它​​所做的只不过是使用消息 1026 (PBM_SETPOS) 调用 SendMessage,该消息告诉 Windows 进度栏设置其位置。

我得出的结论是,Windows 进度条会同步重绘自身以响应 PBM_SETPOS响应 WM_PAINT。或者,它可能在另一个线程上运行计时器,以便执行精美的眩光动画,并且能够重绘控件,而无需等待绘制消息。

无论哪种方式,您所看到的只是 Windows 内部结构 - 而在 WM_PAINT 处理程序之外绘制内容则不是that这是一种不寻常的技术,尽管它不是教科书上做事的方式。

实际上,查看 PBM_SETPOS 的文档(http://msdn.microsoft.com/en-us/library/bb760844(v=vs.85).aspx)它被记录为导致重绘 - 我想这是故意这样做的,以帮助懒惰/缺乏经验的人让阻塞进度条更新正常工作,而无需正确执行所有通常的麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ProgressBar 在阻塞的 UI 线程中更新 的相关文章

  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • 给定路径,如何仅提取包含的文件夹名称?

    在Python中 我应该使用什么命令来获取包含我正在使用的文件的文件夹的名称 C folder1 folder2 filename xml Here folder2 是我想要得到的 我唯一想到的就是使用os path split twice
  • 在 Saxon 9 中,Java XML 解析器无法识别正则表达式中的单词边界 (\b)

    我有以下简单的正则表达式 b w b 撒克逊报告以下错误 syntax error at char 2 in regular expression Escape character b not allowed 这是否意味着我不能在 Java
  • 在 AngularJS 模块中包装 javascript 类并注入 Angular 服务的正确方法

    在我正在开发的 AngularJS 模块中 我有一个Canvas类定义为 angular module myModule factory Canvas function return Canvas var Canvas function e
  • SendInput 和 64 位

    下面是我用来通过 SendInput API 模拟按键的一些代码的摘录 如果我将应用程序设置为针对 x86 CPU 编译 则此方法可以正常工作 但不适用于 x64 CPU 编译 我猜这与 x64 使用双倍大小指针有关 但我试图改变这一点 F
  • Angular.js 路由不适用于 WAMP

    我正在致力于设置一个使用 Express Node mySQL 堆栈构建的 Angular js 单页应用程序 我为路线设置了以下代码 angular module myApp myApp filters myApp services my
  • PHP header() 函数没有重定向[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在使用以下 PHP 代码来检查会话 但是 如果会话未登录 则页面不会重定向 仅显示黑
  • jar 中的类路径资源

    我有一个项目A 其中包含一些java文件和一个类路径资源R txt 在项目中我使用 ClassLoader getSystemResource R txt 检索 R txt 然后我有一个项目 B 其中包含项目 A 的 jar 文件 现在 g
  • 多个线程可以同时向并发集合添加项目吗?

    我正在尝试找出 C 中的并发集合 ConcurrentBag ConcurrentDictionary 和 ConcurrentQueue 多个线程是否可以向其中添加项目EXACTLY同时 还是他们一前一后地等待 我试图检查他们的源代码 但
  • DialogFragment 中的 ActionBar

    在我的 Galaxy Tab 10 1 上的日历应用程序中 创建新事件时 标题栏 操作栏区域中会出现一个对话框 其中包含 完成 和 取消 按钮 我想在我的应用程序中实现这一点 我尝试过使用setHasOptionsMenu true 除了覆
  • Android 无尽适配器

    我正在使用无尽适配器http github com commonsguy cwac endless但是每当我返回 false 因为我没有更多的数据要附加 如此处所述http github com commonsguy cwac endles
  • 插入由触发器生成但未传递的 ID 字段

    在 MySQL 中 我有一个触发器 BEGIN IF EXISTS SELECT FROM devices WHERE device id NEW device id THEN SET NEW id NULL ELSE INSERT INT
  • 如何在 R 中对条形图的订单数据进行“分组”?

    我正在研究生物信息学 我需要输出一个包含祖先结果的图表 条形图 通常 这些图表是通过将人群分组在一起来绘制的 完成的方法是 您只需绘制不同假定人群 此处为 4 的 Q 分数 下面的数据 的条形图 问题是我使用ord tbl order tb
  • 如何在 AppleScriptObjC 中使用 NSAutoreleasePool

    我想知道如何从后台函数停止另一个函数 另外 我必须排空 NSAutoreleasePool 但我不知道该怎么做 我认为如果我不释放池 这个应用程序有时会冻结 property i 0 property myLabel missing val
  • Nginx 和 PHP-cgi - 无法 file_get_contents 服务器上的任何网站

    我认为最好用代码来解释这一点 从网络目录 vi get php 将此 php 添加到 get php IPOFTHESERVER 是运行 nginx 和 PHP 的服务器的 IP php get php 返回该 IP 托管的 默认 网站的内
  • Mifare认证

    假设我想对 Mifare Classic 进行身份验证 我如何知道要发送到卡的 APDU 的确切类型 Example 这段代码 bcla 0xFF bins 0x86 bp1 0x0 bp2 0x0 currentBlock len 0x5
  • 使用 RouteExistingFiles 阻止对现有文件的访问,即使不存在路由

    在 ASP net MVC 2 中 我可以使用routes RouteExistingFiles true 通过路由系统发送所有请求 即使它们存在于文件系统上 通常 这最终会击中 controller action id 路由并抛出异常 因
  • TabActivity 与嵌入 Activity 之间的通信

    我试图找出 TabActivity 和此 TabActivity 中嵌入的子活动之间通信的最佳实践 在我的 TabActivity 中 有一个按钮 单击按钮时 我希望更新此 TabActivity 中嵌入的子活动 我编写了如下代码 只是想知
  • Thymeleaf 和 #fields.hasErrors

    我正在为学校做这项作业 使用 SpringMVC Hibernate JPA 和 Thymeleaf 下面的代码涉及一个名为 stringGrade 的特定属性 我想使用 Hibernate Validator 验证该字段中的输入 我似乎无
  • 选择查询中的 JDBCPreparedStatement 和参数(?)[重复]

    这个问题在这里已经有答案了 我与oracle数据库的连接如下 String selectSQL SELECT supplier name FROM supplier WHERE supplier id PreparedStatement p
  • ProgressBar 在阻塞的 UI 线程中更新

    为什么ProgressBar会在理论上阻塞的UI线程中更新 在简单的应用程序中 我有一个进度栏和一个标签 我在 UI 线程中运行一个耗时的方法 尝试更新 ProgressBar 和标签 这是not应该可以工作 因为 UI 线程被阻塞 但进度