GUI控件上的线程访问

时间:2013-03-12 15:23:43

标签: c# multithreading winforms

我的话题几乎就是问题。我知道线程有限制来访问GUI控件。似乎在另一个线程中编写/设置控件中的某些东西,而主线程是不可能的。

但是,例如,当我尝试读取是否选中了复选框时,它可以正常工作。阅读组合框的文本不会。

我正在使用.net框架4的Windows窗体。

有人可以告诉我线程的限制在哪里吗?

3 个答案:

答案 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);
}

This is a really good resource about threading

答案 2 :(得分:0)

UI元素只能在UI线程上更新 - 您可以检查invoke required是否告诉您是否在另一个线程上。

以下是您可能会遇到的类似问题When is invoke required on GUI objects?