Dispatcher 可为特定线程维护其按优先顺序排列的工作项队列。当在线程中创建了 Dispatcher 时,它将成为可与该线程关联的唯一 Dispatcher ,即使 Dispatcher 已经关闭。 如果尝试获取当前线程的 CurrentDispatcher ,而此时该线程没有关联的 Dispatcher ,则将创建一个 Dispatcher 。 A Dispatcher 在创建时还创建 DispatcherObject 。
通常很多UI对象比如,Window, Button等都是从 DispatcherObject派生。
派生自 DispatcherObject 的对象具有线程关联。只有在其上创建 Dispatcher 的线程才可以直接访问 DispatcherObject 。 若要从不同于在其上创建DispatcherObject 的线程的某个线程访问 DispatcherObject ,需要通过与 DispatcherObject 关联的Dispatcher 调用 Invoke 或 BeginInvoke 。 因此 在WPF中,DispatcherObject 只能通过与它关联的 Dispatcher 进行访问。例如,后台线程不能更新与
UI 线程中的 Dispatcher 关联的 Button 内容。 为了使该后台线程能够访问 Button 的 Content 属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher 。 这可以通过使用 Invoke 或 BeginInvoke 来完成。Invoke 是同步操作,而 BeginInvoke 是异步操作。 该操作将按指定的 DispatcherPriority 添加到Dispatcher 的队列中。
Dispatcher 类当前只提供从非用户界面
(UI) 线程在 UI 上运行代码的支持。通过使用 Invoke 或 BeginInvoke 来 访问
UI 线程的 Dispatcher 对象。 Dispatcher通常的用法是:在非UI线程函数中调用UI的Dispatcher来更新UI. 如果需要更新用来data binding的data,此操作需要在UI thread中进行,通常的做法是UIThread.Dispatcher.Invoke(new System.Action(delegate
{
// update data which is used for data binding.
}), null);
posted on
2013-02-16 11:13
chuwachen
阅读(
308 )
评论()
收藏
举报