从另一个线程刷新一个控件[英] Refresh a control from another thread

问题描述

嗨我想从另一个线程刷新控件,我总是得到这个异常"跨线程操作无效"

解决方案
执行此操作的标准方法是调用 UI 线程以更新控件.假设您使用的是 Windows 窗体,您将执行以下操作:
if (MyControl.InvokeRequired){MyControl.Invoke(new System.Action(MyMethod), myUpdatignValue);}
如果你使用 WPF,它看起来像这样
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action<string>(MyMethod), myUpdatingValue);

除了Pete的回答,还有一些细节:

您不能从非 UI 线程调用与 UI 相关的任何内容.相反,您需要使用 System.Windows.Threading.Dispatcher 的方法 Invoke 或 BeginInvoke(适用于 Forms 或 WPF)或 System.Windows.Forms.Control(仅适用于 Forms).

您将在我过去的答案中找到有关其工作原理和代码示例的详细说明:
Control.Invoke() 与 Control.BeginInvoke()[^],
Treeview 扫描仪和 MD5 的问题[^].

可能需要也可能不需要对 Control.InvokeRequired 的调用.基本上,应该在插入到与用于调用 Control.Invoke 或 Control.BeginInvoke 的控件相同的 UI 层次结构的控件上调用它.也就是说,这些控件不必相同.如果调用线程不是使用这些控件的 UI 线程,则 Control.InvokeRequired 始终返回 true,否则返回 false.由于调用方法通常从非 UI 线程调用(始终为真),因此通常不需要检查.在更罕见的情况下需要 Control.InvokeRequired ,其中调用是从有时从对应的 UI 线程调用的方法调用的(当不需要调用时),有时会形成其他线程(当需要调用时).这样,对 Control.InvokeRequired 的调用就很少需要了.

另请参阅有关线程的更多参考:
如何获取keydown事件在 vb.net 中的不同线程上操作[^],
启用禁用+多线程后控制事件未触发[^].

—SA

本文地址:https://www.itbaoku.cn/post/1394916.html