Dispatcher可以强制将某个代码片段在特定的Thread上执行。
在WPF中,每个线程都有一个与其关联的Dispatcher,通过Dispatcher的Invoke或BeginInvoke或InvokeAsync可以将指定的代码强制在其关联的线程上执行;Invoke是同步的,代码未在关联线程上执行完毕,调用Dispatcher.Invoke()的线程不会往下执行;BeginInvoke和InvokeAsync则是不等待直接继续向下执行。
根据Thread找Dispatcher的API
通过Dispatcher的静态属性CurrentDispatcher可以获取当前线程关联的Dispatcher。
(若当前线程还未构建Dispatcher则就地构建返回,所以CurrentDispatcher不会是null)
System.Windows.Threading.Dispatcher.CurrentDispatcher
或者传入Thread引用,但是如果thread还未关联Dispatcher,FromThread会返回null.
System.Windows.Threading.Dispatcher.FromThread(thread)
Dispatcher类维护一个静态集合,存储线程对应的Dispatcher,每个调用CurrentDispatcher如果缓存中已经存在直接返回,否则new一个Dispatcher放入缓存中再返回。
public static Dispatcher CurrentDispatcher => Dispatcher.FromThread(Thread.CurrentThread) ?? new Dispatcher();
可知:Thread对Dispatcher是一无所知的,只有在线程中调用CurrentDispatcher时WPF才会为当前线程创建关联的Dispatcher。