当前位置: 首页 > article >正文

C#—SynchronizationContext类详解 (同步上下文)

(SynchronizationContext)同步上下文的作用

  • SynchronizationContext 顾名思义是同步上下文的意思。利用此对象可以实现线程间数据的同步、异步访问 ,其实就是实现线程之间通讯的。
  • SynchronizationContext(同步上下文),是一个抽象类,它表示线程上下文,用于协调异步方法(或代理线程)的回调。
  • 使用同步上下文可以使得异步方法(或代理线程)的回调在正确的线程上下文中进行,这样可以避免由于线程上下文切换引发的问题,同时可以更好地掌控异步操作的生命周期。
  • 其实,同步上下文是一种编程模型,它允许多个线程之间的协作,使得程序员可以更加轻松地编写异步代码。

线程教程:C#之多线程-CSDN博客

异步教程:C#——异步Task详情_c# task 异步-CSDN博客

构造函数

SynchronizationContext() 创建 SynchronizationContext 类的新实例。

属性

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

方法

CreateCopy()    在派生类中重写时,创建同步上下文的副本。
Equals(Object)  确定指定对象是否等于当前对象。
(继承自 Object)  GetHashCode()    作为默认哈希函数。
(继承自 Object) GetType()    获取当前实例的 Type。
(继承自 Object) IsWaitNotificationRequired()  确定是否需要等待通知。
 MemberwiseClone()    创建当前 Object 的浅表副本。
(继承自 Object) OperationCompleted()    在派生类中重写时,响应操作已完成的通知。
OperationStarted()    在派生类中重写时,响应操作已开始的通知。
Post(SendOrPostCallback, Object)    在派生类中重写时,将异步消息分派到同步上下文。
Send(SendOrPostCallback, Object)    在派生类中重写时,将同步消息分派到同步上下文。
SetSynchronizationContext(SynchronizationContext)    设置当前同步上下文。
SetWaitNotificationRequired()    

设置指示需要等待通知的通知,并准备回调方法

以使其在发生等待时可以更可靠地被调用。

ToString()    返回表示当前对象的字符串。
(继承自 Object) Wait(IntPtr[], Boolean, Int32)    等待指定数组中的任一元素或所有元素接收信号。
WaitHelper(IntPtr[], Boolean, Int32)    

用于等待指定数组中的任一元素或所有元素接收信

号的 Helper 函数。

适用于

产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard  1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP  10.0

  

创建(SynchronizationContext)同步上下文的方法

  • (1)直接new创建一个SynchronizationContext同步上下文对象。
  • (2)winform程序通过SynchronizationContext.Current获取UI线程的同步上下文对象。
  • (3)AsyncOperation和AsyncOperationManager类来操作同步上下文对象,不直接访问同步上下文对象(SynchronizationContext),推荐这程方法。

(SynchronizationContext)同步上下文的Send和Post方法

  • (1)Send方法就是同步调用,在当前线程上调用委托。
  • (2)Post方法就是异步调用,在线程池中的线程调用委托


 

示例:

使用post方法从将分线程数据传输到主线程

class Program
    {
       static Thread _workThread;
       static SynchronizationContext _mainThreadSynContext;
       static int Val = 0; 

        static void Main(string[] args)
        {
            _mainThreadSynContext = SynchronizationContext.Current;
            if (_mainThreadSynContext == null)
            {
                _mainThreadSynContext = new SynchronizationContext();
            }
            _workThread = new Thread(new ThreadStart(DoWork));
            _workThread.Start();
            Console.ReadLine();
        }

        static void DoWork()
        {
            int a = 10;
            _mainThreadSynContext.Post(new SendOrPostCallback(ThreadCallBack),a);
        }

        static void ThreadCallBack(object state)
        {
           Val = (int)state;
           Console.WriteLine(Vale);  // 10

            Console.ReadLine();
        }
    }

SynchronizationContext 的注意事项

  • 上下文切换:在某些情况下,你可能需要在不同的上下文之间切换。例如,从非 UI 线程切换回 UI 线程以更新界面。
  • 性能考虑:频繁地在上下文之间切换可能会带来性能开销,因此在设计时应尽量减少不必要的上下文切换。
  • 手动上下文管理:如果你需要更细粒度地控制上下文,可以实现自己的SynchronizationContext 类,并覆盖其方法。

  


借鉴网站:

C# 异步编程中的 SynchronizationContext:掌握上下文同步的艺术_c# synchronizationcontext-CSDN博客

SynchronizationContext 类 (System.Threading) | Microsoft Learn

完事!!!
 
 


http://www.kler.cn/a/468109.html

相关文章:

  • hashMap追问
  • Python 中利用装饰器实现多线程函数调用示例
  • 利用Deeplearning4j进行 图像识别
  • Quartus与Synopsys联合调试
  • Golang中的通道和缓冲区
  • 计算机网络相关术语
  • 2025加密风云:行业变革与未来趋势全景透视
  • 2025/1/4期末复习 密码学 按老师指点大纲复习
  • 【51项目】51单片机自制小霸王游戏机
  • 【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus
  • 医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件
  • AI辅助的运维流程自动化:实现智能化管理的新篇章
  • connect to host github.com port 22: Connection timed out 的解决方法
  • R语言的数据结构
  • 城市供水管网多普勒超声波流量计,保障供水安全
  • 【游戏设计原理】46 - 魔杖
  • 一种新的混合大模型架构:TITAN
  • 【Python运维】使用Python与Docker进行高效的容器化应用管理
  • Tomcat性能优化与负载均衡实现
  • 为什么 SPA 应用会提供一个 hash 路由,好处是什么