DispatcherSynchronizationContext and Dispatcher

https://www.cnblogs.com/liangouyang/archive/2008/11/20/1337907.html

SynchronizationContext提供一个自由线程的同步上下文,一个常用的用法是把UI线程的同步上下文保存起来,传给另一个线程,因为UI只能再UI线程中操作,在另外一个线程,用SynchronizationContext把操作跳转到UI线程。

SynchronizationContext.Current 获取当前线程的同步上下文

SynchronizationContext.Post() 在这个上下文下发送异步方法

SynchronizationContext.Post () 在这个上下文下发送同步方法

SynchronizationContext.SetSynchronizationContext() 设置当前同步上下文

两个子类:WindowsFormsSynchronizationContext : windows form同步环境

DispatcherSynchronizationContext : WPF同步上下文

DispatcherSynchronizationContext构造函数可以传dispather,如果没有传入,则默认与当前dispather关联。

The Dispatcher maintains a prioritized queue of work items for a specific thread,就是windows的消息泵.一个dispatcher只能与一个线程相关联,关闭则不能重启。调Dispatcher.CurrentDispatcher时,如果当前线程没有dispather,会创建一个。在wpf中,DependencyObject只能被其关联的dispatcher访问。

SynchronizationContext VS Dispatcher

Dispather更加适用于能够确认在UI线程中调用的情况,在不能确认的时候更适合用SynchronizationContext。如果在非UI线程调Dispather.CurrentDispatcher(), 然后dispatcher.BeginInvoke(),什么都不会发生,没有异常,没有警告。如果在非UI线程调SynchronizationContext.Current,则返回null.利用这个特性,可以对UI与非UI分别操作:

Public void start()

{

m_Context = SynchronizationContext.Current;

if (m_Context != null)

{

m_Context.Post(new SendOrPostCallback(PostCallback), message);

}

else OnMessage(message); // non-UI thread called Start

}

相关推荐
大鹏说大话20 小时前
什么是“过早优化”?
开发语言
码云数智-园园20 小时前
RESTful API vs GraphQL:设计哲学、性能博弈与选型指南
开发语言
每天吃饭的羊20 小时前
nest,java对比
java·开发语言
sycmancia20 小时前
Qt——登录对话框
开发语言·qt
专注VB编程开发20年20 小时前
WebView2同时执行多个Promise异步任务性能损失1毫秒以内
开发语言
froginwe1120 小时前
Perl 目录操作指南
开发语言
架构师老Y20 小时前
010:API网关调试手记:路由、认证与限流的那些坑
开发语言·前端·python
前端老石人20 小时前
无障碍访问
开发语言·前端·html
软件开发技术20 小时前
最新在线留言板系统PHP源码
开发语言·php·留言板系统php源码
Java基基20 小时前
Maven 4要来了:15年后,Java构建工具迎来“彻底重构”
java·开发语言·重构