WPF Dispatcher及线程

一.编程

  wpf中几乎全部的对象都继承自DispatcherObject,甚至包括 Application。这些继承自 DispatcherObject 的对象具备线程关联特征,也就意味着只有建立这些对象实例,且包含了 Dispatcher 的线程(一般指默认 UI 线程)才能直接对其进行更新操做。安全

二   .BeginInvoke和Invoke的区别多线程

   Invoke:在拥有该控件的基础窗口句柄的线程上执行制定的委托,也就是会阻塞调用线程异步

   BeginInvoke:                                                   异步,非阻塞。   性能

  1. C#多线程 Invoke方法的使用 spa

  在多线程编程中,咱们常常要在工做线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的作法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。.net

正确的作法是将工做线程中涉及更新界面的代码封装为一个方法,经过 Invoke 或者 BeginInvoke 去调用,二者的区别就是一个致使工做线程等待,而另一个则不会。线程

 

  2.对象

Delegate.BeginInvoke

经过一个委托来进行同步方法的异步调用,也是.net提供的异步调用机制之一。可是Delegate.BeginInvoke方法是从ThreadPool取出一个线程来执行这个方法,以得到异步执行效果的。也就是说,若是采用这种方式提交多个异步委托,那么这些调用的顺序没法获得保证。并且因为是使用线程池里面的线程来完成任务,使用频繁,会对系统的性能形成影响。继承

Delegate.BeginInvoke也是讲一个委托方法封送到其它线程,从而经过异步机制执行一个方法。调用者线程则能够在完成封送之后去继续它的工做。可是这个方法封送到的最终执行线程是运行库从ThreadPool里面选取的一个线程。

这里须要纠正一个误区,那就是Control类上的异步调用BeginInvoke并无开辟新的线程完成委托任务,而是让界面控件的所属线程完成委托任务的。看来异步操做就是开辟新线程的说法不必定准确。