gpt4 book ai didi

c# - UI线程阻塞中的ProgressBar更新

转载 作者:行者123 更新时间:2023-12-03 12:50:05 24 4
gpt4 key购买 nike

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

在简单的应用程序中,我有一个ProgressBar和一个Label。我在UI线程中运行一个耗时的方法,该方法试图更新ProgressBar和标签。由于UI线程被阻止,因此该方法不起作用。但是ProgressBar正在更新!

在对表单执行任何操作并将其冻结之前,ProgressBar会更新(标签不会)。

这是为什么?

示例代码(在窗体上放置一个Button,一个ProgressBar和一个Label):

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

ProgressBar正在更新,Label没有更新。我的问题不是如何同时更新标签,而是为什么要更新ProgressBar。我确实了解线程,DoEvent,异步/等待,但这不是答案。

最佳答案

我认为,要在不拆卸Windows的情况下很难完全回答这个问题,这对我来说现在太繁琐了。

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

我可以得出结论,Windows进度条响应PBM_SETPOS以及WM_PAINT同步重新绘制自己。也许它正在另一个线程上运行计时器以执行炫目的眩光动画,并且无需等待绘制消息即可重绘控件。

无论哪种方式,都只是Windows内部的东西-在WM_PAINT处理程序之外绘制内容并不是一种不寻常的技术,即使它不是教科书中的处理方式。

实际上,查看有关PBM_SETPOS(http://msdn.microsoft.com/en-us/library/bb760844(v=vs.85).aspx)的文档,发现它引起了重绘-我想这是有意为之,以帮助懒惰/缺乏经验的人阻止进度条更新正常工作,而没有通常的麻烦。

关于c# - UI线程阻塞中的ProgressBar更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6095800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com