同步上下文 SynchronizationContext 学习笔记
提供在各种同步模型中传播同步上下文的基本功能。,同步上下文的工作就是确保调用在正确的线程上执行。
同步上下文的基本操作
Current 获取当前同步上下文
var context = SynchronizationContext.Current;
1 |
Send 一个同步消息调度到一个同步上下文。
SendOrPostCallback callback = o =>
{
//TODO:
};
context.Send(callback,null);
send调用后会阻塞直到调用完成。
Post 将异步消息调度到一个同步上下文。
SendOrPostCallback callback = o =>
{
//TODO:
};
context.Post(callback,null);
和send的调用方法一样,不过Post会启动一个线程来调用,不会阻塞当前线程。
使用同步上下文来更新UI内容
无论WinFroms和WPF都只能用UI线程来更新界面的内容
常用的调用UI更新方法是Inovke(WinFroms):
private void button_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(BackgroudRun);
}
private void BackgroudRun2(object state)
{
this.Invoke(new Action(() =>
{
label1.Text = "Hello Invoke";
}));
}
使用同步上下文也可以实现相同的效果,
WinFroms和WPF继承了SynchronizationContext,使同步上下文能够在UI线程或者Dispatcher线程上正确执行
System.Windows.Forms. WindowsFormsSynchronizationContext
System.Windows.Threading. DispatcherSynchronizationContext
调用方法如下:
private void button_Click(object sender, EventArgs e)
{
var context = SynchronizationContext.Current; //获取同步上下文
Debug.Assert(context != null);
ThreadPool.QueueUserWorkItem(BackgroudRun, context);
}
private void BackgroudRun(object state)
{
var context = state as SynchronizationContext; //传入的同步上下文
Debug.Assert(context != null);
SendOrPostCallback callback = o =>
{
label1.Text = "Hello SynchronizationContext";
};
context.Send(callback,null); //调用
}
使用.net4.0的Task 可以简化成
private void button_Click(object sender, EventArgs e)
{
var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); // 创建一个SynchronizationContext 关联的 TaskScheduler
Task.Factory.StartNew(() => label1.Text = "Hello TaskScheduler", CancellationToken.None,
TaskCreationOptions.None, scheduler);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库