WPF Invoke和BeginInvoke
在WPF中Invoke和BeginInvoke和Winform中的是差不多的,只是一个用Control的一个用Dispatcher的。
而Invoke和BeginInvoke的区别嘛 就是一个是同步的一个是异步的,也就是一个需要等待一个不需要= =
就比如一个最简单区别的例子:
//这个输出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"; })); }