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();

C# 调用仅用于写入访问

MSDN 库对此没有任何内容,它声明 Control 类的每个方法和属性都不安全,除了 InvokeRequired、BeginInvoke、Invoke 和 CreateGraphics。

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

是的,ProgressBar.Value 使用这样一个支持变量,即私有字段。 您可以从引用源或反编译器中分辨出来。 然而,这只是为了获得者,二传手肯定不是。 因为它需要实际更改控件的可见外观。

顺便说一句,总是喜欢开始调用而不是调用。 调用具有非常令人不快的特性,它很容易导致死锁并且非常慢。 只有当你需要它的返回值时,你才需要 Invoke((,而不是这里的情况。

这取决于该写入将要做什么。例如,您可以在任何线程中读/写Tag控件属性,而不会出现任何问题。

从技术上讲,触发对Control.Handle属性调用的任何内容都应该处于UIThread中,因为UIThread拥有该控件,因此应仅在该线程中访问它,否则它最终会在附加调试器时引发InvalidOperationException