gpt4 book ai didi

c# - 为什么控件上的某些属性具有更高的优先级

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:44 27 4
gpt4 key购买 nike

this 开始问题,为什么控件的某些属性(例如 Label 类)会导致调用 Control.Handle 但其他属性不会。

那么我只能假设,只有当窗口需要刷新时,标签前景色的更改才会出现。如果是这种情况,那么是什么让 Text 属性如此重要以至于它需要在其值发生变化时立即通知窗口?

最佳答案

它与“优先级”没有任何关系,它只是与控件的工作方式有关。 MSDN 库记录了线程安全的 Control 类的四个成员:InvokeRequired、BeginInvoke、Invoke 和 CreateGraphics。但是在一些特殊情况下,代码可以是线程安全的,即使它使用另一个成员也是如此。

例如,大多数控件的 Text 属性可安全读取但不可写入。属性值存储在支持字段中的一个简单副作用,一种避免必须进行昂贵的 winapi 调用的优化。当您阅读该属性时有效,您只需获得支持字段值。但是当你写的时候不是,因为这需要设置支持字段更新 native 窗口。后者的操作触发异常。

BackColor 和 ForeColor 等属性通常是线程安全的。因为它们很简单,所以它们的 setter 只更新一个支持字段并调用 Invalidate() .这是一个安全函数,当它的 invalidateChildren 参数为 false 时,它​​只更新窗口的“脏矩形”。稍后导致在 UI 线程上触发 Paint 事件的事件。

这是一个太多的优化。它是线程安全的,因为它不会导致您的程序因死锁或令人讨厌的无法诊断的异常而崩溃。然而,它并不能保证用户实际上可以看到更新后的颜色。如果您的工作线程更新 BackColor 并且 UI 线程正忙于在同时绘制窗口,那么它将使用 BackColor 的陈旧值,但在绘制完成时仍将窗口标记为有效。实际上永远不会改变背景颜色。直到下一次控件重新绘制自身时才会生效,这可能需要很长时间。使用线程的程序中的标准事故,称为 threading race .这个非常良性。但是像所有线程竞争一样非常难以诊断,这不会经常出错。

关于c# - 为什么控件上的某些属性具有更高的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22329313/

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