在此重新学习一下Dispatcher.Invoke的定义:
从主 UI 线程派生的后台线程不能更新的内容
Button UI 线程上创建。 为了使后台线程访问的内容属性的
Button, ,后台线程必须将工作委托给
Dispatcher 与 UI 线程关联。 这通过使用实现
Invoke 或
BeginInvoke。 Invoke 是同步和
BeginInvoke 是异步的。
主要原因是C#是主线程在运行,而WPF是代码和界面分开的两个线程在运行。
第一种方法:
WinForms
privatedelegatevoidUpdateUiTextDelegate(Control control, stringtext);
privatevoidUpdateUiText(Control control, stringtext)
{
if(InvokeRequired)
{
Invoke(newUpdateUiTextDelegate(UpdateUiText), newobject[] {control, text});
return;
}
control.Text = text;
}
WPF
privatevoidUpdateUiText(Control control, stringtext)
{
if(!Dispatcher.CheckAccess())
{
Dispatcher.Invoke(DispatcherPriority.Send, newUpdateUiTextDelegate(UpdateUiText), control, text);
return;
}
control.Text = text;
}
第二种方法:
C#:
private delegate void SetRichTextBoxReceiveCallBack(string str);
private SetRichTextBoxReceiveCallBack setRichTextBoxReceiveCallBack;
richTextBoxRecv.Invoke(setRichTextBoxReceiveCallBack, Encoding.UTF8.GetString(dataRead.msg, 0, recv));
使用委托进行的!
WPF:
private void showMessage(string msg)
{
Action action = () => richTextBoxRecv.AppendText(msg + "\r\n");
if (System.Threading.Thread.CurrentThread !=
richTextBoxRecv.Dispatcher.Thread)
{
richTextBoxRecv.Dispatcher.Invoke
(System.Windows.Threading.DispatcherPriority.Normal,
action);
}
else
{
action();
}
}
showMessage(Encoding.UTF8.GetString(dataRead.msg, 0, recv).Trim());
也是使用委托,只是进行改造。