Ary*_*rya 4 c# user-interface multithreading class
我一直在研究如何做这个约一个星期,我仍然不确定正确的方法,在一些例子中我看到Thread类用于其他我看到Invoke使用,这让我感到困惑.
我在c#中有一个GUI程序,它包含一个textBox,用于向用户提供信息.
我面临的问题是我不知道如何从另一个在另一个线程上运行的类向textBox追加文本.如果有人能告诉我一个有效的例子,那对我有很大的帮助.
最好的祝福!
简单:
MainWindow.myInstance.Dispatcher.BeginInvoke(new Action(delegate() {MainWindow.myInstance.myTextBox.Text = "some text";});
Run Code Online (Sandbox Code Playgroud)
WHERE MainWindow.myInstance是一个设置为MainWindow实例的公共静态变量(应该在构造函数中设置,并且在构造实例之前将为null).
好吧,在一行中有很多让我重复一遍:
当您想要更新UI控件时,正如您所说,您必须从UI线程执行此操作.内置了将委托(方法)传递给UI线程的方法:Dispatcher.我使用MainWindow.myInstance(因为所有UI组件)都包含对Dispatcher的引用 - 您也可以在自己的变量中保存对Dispatcher的引用:
Dispatcher uiDispatcher = MainWindow.myInstance.Dispatcher;
Run Code Online (Sandbox Code Playgroud)
拥有Dispatcher之后,您可以调用BeginInvoke()的Invoke()传递一个委托,以便在UI线程上运行.唯一的区别是Invoke()只会在委托运行后返回(即在你的情况下已经设置了TextBox的Text),而BeginInvoke()将立即返回,因此你调用的其他线程可以继续(Dispatcher将运行)你的代表很快就可以直接离开了.)
我通过了一位匿名代表:
delegate() {myTextBox.Text = "some text";}
Run Code Online (Sandbox Code Playgroud)
{}之间的位是方法块.这称为匿名,因为只创建了一个并且它没有名称 - 但我可以实例化一个委托:
Action myDelegate = new Action(UpdateTextMethod);
void UpdateTextMethod()
{
myTextBox.Text = "new text";
}
Run Code Online (Sandbox Code Playgroud)
然后通过:
uiDispatcher.Invoke(myDelegate);
Run Code Online (Sandbox Code Playgroud)
我还使用了Action类,它是一个内置的委托,但你可以创建自己的 - 你可以在MSDN上阅读更多关于委托的内容,因为这有点偏离主题..