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

}

相关推荐
guygg8812 分钟前
基于ADMM的MRI-PET高质量图像重建算法MATLAB实现
开发语言·算法·matlab
小小程序员mono12 分钟前
JS 与 Vue Router 导航方式对比
开发语言·javascript·vue.js
feifeigo12315 分钟前
基于MATLAB的V-BLAST结构BER仿真
开发语言·matlab
lly20240623 分钟前
Perl 数据库连接
开发语言
小白-Tester25 分钟前
2026最新Postman安装教程[简单易懂]附安装包
开发语言·lua
春日见38 分钟前
端到端大模型自动驾驶
java·开发语言·驱动开发·docker·自动驾驶·计算机外设
A.A呐1 小时前
【QT第三章】常用控件2
开发语言·qt
白云如幻1 小时前
【JDBC】集合、反射和泛型复习-3
java·开发语言·jdbc
笨笨马甲1 小时前
Qt 实现三维坐标系的方法
开发语言·qt
bugcome_com1 小时前
C# 高级集合使用示例
开发语言·c#