C# 调用仅用于写入访问
本文关键字:访问 用于 调用 | 更新日期: 2023-09-27 18:32:48
如果访问是写入访问,我只需要使用 Invoke 吗?在不调用的情况下获取 GUI 对象的属性是否安全?
new Thread(() =>
{
Invoke((MethodInvoker)(() => mbrVerticalProgressBar1.Value++));
if (TaskbarManager.IsPlatformSupported)
{
TaskbarManager.Instance.SetProgressValue(
mbrVerticalProgressBar1.Value,
mbrListOfURLsCount);
}
}).Start();
MSDN 库对此没有任何内容,它声明 Control 类的每个方法和属性都不安全,除了 InvokeRequired、BeginInvoke、Invoke 和 CreateGraphics。
这并不完全准确,肯定有一些属性是意外的线程安全的,因为它们使用支持变量。 你必须知道属性获取器的实际实现,并赌一把,将来不会有机会。
是的,ProgressBar.Value 使用这样一个支持变量,即私有值字段。 您可以从引用源或反编译器中分辨出来。 然而,这只是为了获得者,二传手肯定不是。 因为它需要实际更改控件的可见外观。
顺便说一句,总是喜欢开始调用而不是调用。 调用具有非常令人不快的特性,它很容易导致死锁并且非常慢。 只有当你需要它的返回值时,你才需要 Invoke((,而不是这里的情况。
这取决于该写入将要做什么。例如,您可以在任何线程中读/写Tag
控件属性,而不会出现任何问题。
从技术上讲,触发对Control.Handle
属性调用的任何内容都应该处于UIThread
中,因为UIThread
拥有该控件,因此应仅在该线程中访问它,否则它最终会在附加调试器时引发InvalidOperationException
。