我的话题几乎是个问题。我知道有一个线程访问GUI控件的限制。似乎是从另一个主线程不可能的线程写入/设置控件。线程访问GUI控件
但是,例如,当我尝试读取复选框是否被选中时,它就起作用。阅读组合框的文本不会。
我使用Windows窗体和.NET框架4
有人能告诉我哪里有局限性线程?
我的话题几乎是个问题。我知道有一个线程访问GUI控件的限制。似乎是从另一个主线程不可能的线程写入/设置控件。线程访问GUI控件
但是,例如,当我尝试读取复选框是否被选中时,它就起作用。阅读组合框的文本不会。
我使用Windows窗体和.NET框架4
有人能告诉我哪里有局限性线程?
UI元素只能在UI线程上进行更新 - 您可以检查是否invoke required让你知道,如果你在另一个线程。
这里有一个类似的问题,你可能会喜欢When is invoke required on GUI objects?
谢谢,我正在问一个更一般的答案。所以我猜想没有。即使我没有明确地尝试写UI,即使阅读通常不是一个好主意,即使它有效! – derape 2013-03-12 15:32:54
我不会依赖它的工作,没有 – NDJ 2013-03-12 15:34:50
你也可能喜欢这个链接 - 答案说'有可能(读取值),但可能导致意外的行为 - http://stackoverflow.com/questions/13975938/ is-it-it-it-access-a-ui-element-from-another-thread-if-the-thread-doesnt – NDJ 2013-03-12 15:37:17
无论何时访问UI元素,您都必须在UI线程上。您观察到的内容不取决于控件是复选框还是下拉菜单,而取决于您正在访问的线程。
Windows窗体控件提供Invoke
方法调用对UI线程的调用。还有一个异步BeginInvoke
。异步调用可能会加速您的系统(取决于您的设计)。
有一个在WPF的调度的文章:Build More Responsive Apps With The Dispatcher
您可以调用一个动作做UI的东西,但是当你需要从你的工作线程访问它的东西时,才需要。
void UpdateMessage (string message)
{
Action action =() => txtMessage.Text = message;
this.Invoke (action);
}
什么UI框架,你要求? – thumbmunkeys 2013-03-12 15:25:57
即时例外是调试功能。读取复选框不一定安全。限制是:_entire_ GUI不是线程安全的。 – 2013-03-12 15:27:59
@Servy这不是一个渎职重复,因为他要求改变ui。我说我知道changig是不好的,但我不确定要阅读 – derape 2013-03-12 15:39:15