同步上下文 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);
}



posted @   kiminozo  阅读(5655)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示