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 线程中更新 的相关文章

  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet

随机推荐

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

    在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 线程被阻塞 但进度