C#从线程访问多个控件

时间:2017-07-07 12:13:26

标签: c# multithreading controls

我有一个代码,当你点击开始时,为了安全起见,必须禁用一些控件...:

Thread t = new Thread(() => MyMethod(text));

button1.Enabled = false;
textBox2.Enabled = false;
button2.Enabled = false;

t.Start();

这不是问题。 我的问题是我应该把所有这些都重新打开,我的意思是当MyMethod结束时,我必须Invoke我要启用它们的所有控件。

MyMethod(string text){
.
.
.
button1.Invoke(new MethodInvoker(delegate{ button1.Enabled=true; }));
textBox2.Invoke(new MethodInvoker(delegate{textBox2.Enabled=true; }));
button2.Invoke(new MethodInvoker(delegate{ button2.Enabled=true; }));
}

因此,如果我们有一堆控件集,那么很难在线程中更改它们的值。

无论如何更容易或更快地访问这些?

谢谢,

1 个答案:

答案 0 :(得分:1)

在单独的线程中调用方法之前存储当前的调度程序。

var uiDispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;

在MyMethod中使用Dispatcher,例如:

void MyMethod(Dispatcher uiDispatcher)
{
...

    uiDispatcher.Invoke(() =>
                {
    button1.Enabled = true;
    button2.Enabled = true;
    ...
                });
}