1. 程式人生 > >關於C#下面的Invoke 和在WPF中使用的Dispatcher.Invoke的區別

關於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());

      也是使用委託,只是進行改造。