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