關於C#下面的Invoke 和在WPF中使用的Dispatcher.Invoke的區別
在此重新學習一下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());
也是使用委託,只是進行改造。