WPF Invoke與BeginInvoke的區別


  • Control.Invoke 方法 (Delegate) :在擁有此控件的基礎窗口句柄的線程上執行指定的委托。
  • Control.BeginInvoke 方法 (Delegate) :在創建控件的基礎句柄所在線程上異步執行指定委托。

    就是一個是同步的一個是異步的,也就是一個需要等待一個不需要等待

復制代碼
//這個輸出123
        private void button1_Click(object sender, RoutedEventArgs e) {
            textblock.Text += "1";
            this.Dispatcher.Invoke(new InvokeDelegate(Test));
            textblock.Text += "3";
        }

        private void Test() {
            textblock.Text += "2";
        }

        private delegate void InvokeDelegate();

//這個輸出132
        private void button1_Click(object sender, RoutedEventArgs e) {
            textblock.Text += "1";
            this.Dispatcher.BeginInvoke(new InvokeDelegate(Test));
            textblock.Text += "3";
        }

        private void Test() {
            textblock.Text += "2";
        }
復制代碼

Invoke是線程中比較重要的一個東西,在多線程的編程中,平常在更新界面的時候,可以用UI線程去做來減輕工作線程的負擔。比如下面這樣放在線程中:

 

復制代碼
private void button1_Click(object sender, RoutedEventArgs e) {
            Thread invokeThread = new Thread(new ThreadStart(Method));
            invokeThread.Start();
            //...運算代碼
        }

        private void Method(){
            this.Dispatcher.BeginInvoke(new InvokeDelegate(Test));
        }

        private void Test() {
            textblock.Text += "123";
        }

        private delegate void InvokeDelegate();
復制代碼

簡單寫法如下:

private void button_Click(object sender, RoutedEventArgs e) {
            this.Dispatcher.BeginInvoke(new Action(() => { this.textblock.Text += "123"; }));
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM