WPF 线程

来源:互联网 发布:北京大学远程网络教育 编辑:程序博客网 时间:2024/06/07 13:15

初学习WPF,记录下学习笔记
WPF更新界面与winform有相同的地方,也有不同的地方,相同的地方:
都可以使用直接赋值属性或者在其他线程上调用委托切换到主线程上更新数据,不同的地方是WPF可以使用绑定对象的方式更新界面,提供了很多灵活性,我现在要说的是相同的地方,尽管理论是相同的,但是使用起来还有有差别:
1.WPF 获取主线程调度的方法:

 private void Button_Click(object sender, RoutedEventArgs e)        {            System.Windows.Threading.Dispatcher d1 = System.Windows.Threading.Dispatcher.CurrentDispatcher;            System.Windows.Threading.Dispatcher d2 = this.Dispatcher;            MessageBox.Show((d1.Equals(d2)).ToString());        }

上述的结果是“true”可以看到获取主线程的调度有两种方法,其中this表示当前的主窗体
2.其他线程的调度:我们将上面的代码稍作修改:

private void Button_Click(object sender, RoutedEventArgs e)        {                 System.Windows.Threading.Dispatcher d1 = System.Windows.Threading.Dispatcher.CurrentDispatcher;            System.Windows.Threading.Dispatcher d2=null;            System.Threading.Thread t = new System.Threading.Thread(() => { DoSomething(d2); });            t.Start();            MessageBox.Show((d1.Equals(d2)).ToString());        }void DoSomething(System.Windows.Threading.Dispatcher d)        {            d=System.Windows.Threading.Dispatcher.CurrentDispatcher;            System.Threading.Thread.Sleep(5000);        }

可以看到上述代码的结果为“false”.说明两个调度是不一样的。
如果我们再加入如下代码:

private void Button_Click(object sender, RoutedEventArgs e)        {                 System.Windows.Threading.Dispatcher d1 = System.Windows.Threading.Dispatcher.CurrentDispatcher;            System.Windows.Threading.Dispatcher d2=null;            System.Threading.Thread t = new System.Threading.Thread(() => { DoSomething(d2); });            t.Start();            MessageBox.Show((d1.Equals(d2)).ToString());            **d1.Invoke(() => { this.Title = "使用主线程调用"; });            d2.Invoke(() => { this.Title = "使用其他线程调用"; });**/此处会报错        }void DoSomething(System.Windows.Threading.Dispatcher d)        {            d=System.Windows.Threading.Dispatcher.CurrentDispatcher;            System.Threading.Thread.Sleep(5000);        }

在d2.Invoke(() => { this.Title = “使用其他线程调用”; })处会报错。
总结:从上面两个例子可以看出,我们经常在线程中用this.Dispatcher.Invoke(new Action(…))其实就是将线程从其他线程切换到主线程。我们也可以在主线程中的到其他线程的调度,然后在利用Invoke方法,相当于在线程中执行方法。

0 0