2013-03-12 75 views
2

我的话题几乎是个问题。我知道有一个线程访问GUI控件的限制。似乎是从另一个主线程不可能的线程写入/设置控件。线程访问GUI控件

但是,例如,当我尝试读取复选框是否被选中时,它就起作用。阅读组合框的文本不会。

我使用Windows窗体和.NET框架4

有人能告诉我哪里有局限性线程?

+0

什么UI框架,你要求? – thumbmunkeys 2013-03-12 15:25:57

+2

即时例外是调试功能。读取复选框不一定安全。限制是:_entire_ GUI不是线程安全的。 – 2013-03-12 15:27:59

+1

@Servy这不是一个渎职重复,因为他要求改变ui。我说我知道changig是不好的,但我不确定要阅读 – derape 2013-03-12 15:39:15

回答

0

UI元素只能在UI线程上进行更新 - 您可以检查是否invoke required让你知道,如果你在另一个线程。

这里有一个类似的问题,你可能会喜欢When is invoke required on GUI objects?

+0

谢谢,我正在问一个更一般的答案。所以我猜想没有。即使我没有明确地尝试写UI,即使阅读通常不是一个好主意,即使它有效! – derape 2013-03-12 15:32:54

+0

我不会依赖它的工作,没有 – NDJ 2013-03-12 15:34:50

+0

你也可能喜欢这个链接 - 答案说'有可能(读取值),但可能导致意外的行为 - 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

1

无论何时访问UI元素,您都必须在UI线程上。您观察到的内容不取决于控件是复选框还是下拉菜单,而取决于您正在访问的线程。

Windows窗体控件提供Invoke方法调用对UI线程的调用。还有一个异步BeginInvoke。异步调用可能会加速您的系统(取决于您的设计)。

有一个在WPF的调度的文章:Build More Responsive Apps With The Dispatcher

1

您可以调用一个动作做UI的东西,但是当你需要从你的工作线程访问它的东西时,才需要。

void UpdateMessage (string message) 
{ 
    Action action =() => txtMessage.Text = message; 
    this.Invoke (action); 
} 

This is a really good resource about threading