我的话题几乎就是这个问题。我知道线程访问 GUI 控件存在限制。似乎不可能从主线程以外的另一个线程在控件中写入/设置某些内容。
但是例如,当我尝试读取复选框是否被选中时,它可以工作。阅读组合框的文本不会。
我正在使用带有 .net 框架 4 的 Windows 窗体。
有人能告诉我线程的限制在哪里吗?
我的话题几乎就是这个问题。我知道线程访问 GUI 控件存在限制。似乎不可能从主线程以外的另一个线程在控件中写入/设置某些内容。
但是例如,当我尝试读取复选框是否被选中时,它可以工作。阅读组合框的文本不会。
我正在使用带有 .net 框架 4 的 Windows 窗体。
有人能告诉我线程的限制在哪里吗?
每当您访问 UI 元素时,您都必须在UI 线程上。您观察到的内容不取决于控件是复选框还是下拉列表,而是您从哪个线程访问。
Windows 窗体控件提供Invoke
方法调度对 UI 线程的调用。还有一个async BeginInvoke
。异步调用可能会加速您的系统(取决于您的设计)。
WPF中有一篇关于Dispatcher的文章:Build More Responsive Apps With The Dispatcher
您可以调用一个操作来使用 UI 执行某些操作,但仅当您需要从工作线程访问某些内容时才需要它。
void UpdateMessage (string message)
{
Action action = () => txtMessage.Text = message;
this.Invoke (action);
}
UI 元素只能在 UI 线程上更新 - 您可以检查是否需要调用来让您知道您是否在另一个线程上。
这是一个类似的问题,您可能会喜欢GUI 对象何时需要调用?