1

如果访问是写访问,我是否只需要使用调用?在不调用的情况下获取 GUI 对象的属性是否安全?

new Thread(() =>
{
   Invoke((MethodInvoker)(() => mbrVerticalProgressBar1.Value++));

if (TaskbarManager.IsPlatformSupported)
{
   TaskbarManager.Instance.SetProgressValue(
       mbrVerticalProgressBar1.Value,
       mbrListOfURLsCount);
}
}).Start();
4

2 回答 2

2

MSDN 库对此毫不含糊,它声明了 Control 类线程不安全的所有方法和属性,除了 InvokeRequired、BeginInvoke、Invoke 和 CreateGraphics。

这并不完全准确,肯定有一些属性是意外线程安全的,因为它们使用了支持变量。您必须知道属性 getter 的实际实现,并赌一把,以后不会有机会。

是的,ProgressBar.Value 使用了这样一个支持变量,即私有字段。您可以从参考源或反编译器中得知。但是,这仅适用于 getter,setter 肯定不是。因为它需要真正让控件的可见外观发生变化。

顺便说一句,总是喜欢 BeginInvoke 而不是 Invoke。Invoke 有一个非常令人不快的特性,它很容易导致死锁,而且速度很慢。只有在需要Invoke() 的返回值时才需要它,而不是这里的情况。

于 2013-09-26T10:00:57.443 回答
1

这取决于该写入将要做什么。例如,您可以Tag毫无问题地在任何线程中读取/写入控件的属性。

从技术上讲,任何触发Control.Handle属性调用的东西都应该在其中,UIThread因为UIThread拥有该控件,因此它应该只在该线程中访问,否则它最终会抛出一个附加的InvalidOperationException调试器。

于 2013-09-26T09:17:59.590 回答