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

news2025/1/7 7:43:29

(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.coloradmin.cn/o/2271680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况,不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时,除了遵循一些 顺序、简化、命名上的规范,让css具有合理性也是重要的一环。 最近的需求场…

【C++】深入理解C语言中的特殊字符处理与问题分析优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目:B2090 年龄与疾病输入格式输出格式输入输出样例 💯初始代码分析与问题排查问题点分析 💯修正后的代码与优化修正与优化要点 &#…

面试题解,JVM中的“类加载”剖析

一、JVM类加载机制说一下 其中,从加载到初始化就是我们的类加载阶段,我们逐一来分析 加载 “加载 loading”是整个类加载(class loading)过程的一个阶段,加载阶段JVM需要完成以下 3 件事情: 1&#xff0…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

构建一个rust生产应用读书笔记7-确认邮件3

设计架构思路 从前面的学习过程中,我们从单一文件测试套件发展到模块化测试套件,并构建了一套强大的辅助工具,这是一个非常重要的进展。个人认为测试代码和应用代码一样,是一个持续进化的过程。随着项目的不断成长,测…

默认ip无法访问,利用dhcp功能获取ip进行访问的方法

应用场景: ac的默认ip如192.168.1.1在pc与ac的eth2以后网口直连无法ping通,而且pc改为dhcp自动获取ip也获取不到ip地址,无法进行web配置和命令行操作。 原因是ac或其他设备被修改了默认ip或者对应端口所属vlanid,现在的端口vlan…

redis的集群模式与ELK基础

一、redis的集群模式 1.主从复制 (1)概述 主从模式:这是redis高可用的基础,哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的,主负责写入,然后把写入的数据同步到从服务器&#xff…

大脑特训,自信 “满格”

编辑:念小艺 在追求自信的漫漫长路上,诸多因素如同闪耀的星光,为人们指引着方向。保持良好的饮食习惯,让身体摄取充足且均衡的营养,为精神的饱满提供坚实后盾;持续投身于锻炼之中,在挥洒汗水的…

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台!&#xff0…

计算机的发展、计算机基本组成原理

计算机系统 软件 硬件 硬件的发展 软件的发展 低级语言:机器语言、汇编语言 一、早期冯诺依曼机的结构 存储程序:将指令以二进制代码事先输入计算机的主存储器 在计算机系统软件和硬件是等效的 软件:数据 程序 硬件: 存储器、…

公共数据授权运营系统建设手册(附下载)

在全球范围内,许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台,推动数据的开放共享,促进数据的创新应用,不仅能够提高政府决策的科学性和公共服务的效率,还能够激发市场活力&#xff0…

[极客大挑战 2019]HardSQL 1

看了大佬的wp,没用字典爆破,手动试出来的,屏蔽了常用的关键字,例如:order select union and 最搞的是,空格也有,这个空格后面让我看了好久,该在哪里加括号。 先传入1’ 1试试&#…

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling(事件处理)3. Multitasking(多任务处理)4. Push Notifications(推送通知&…

STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !

一)问题:用ULINK2给STM32F103C8T6下载程序,下载方式设置如下: 出现下面两个问题: 1)下载问题界面如下: 这个错误的信息大概可以理解为,在0x08000063地址上读取到flash存储为FF&am…

使用命令行管理git项目

# 初始化一个新的Git仓库 git init # 添加文件到暂存区 git add <file> # 提交暂存区的更改到仓库 git commit -m "commit message" # 查看当前仓库的状态 git status # 查看提交历史 git log # 查看文件的改动 git diff <file> # 创建一个新…

论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models

1.abstract 最近推出的3D高斯飞溅(3DGS)&#xff0c;它用多达数百万个原始椭球体来描述场景&#xff0c;可以实时渲染。3DGS迅速声名鹊起。然而&#xff0c;一个关键的悬而未决的问题仍然存在&#xff1a;我们如何将多个3DG融合到一个连贯的模型中&#xff1f;解决这个问题将使…

javaEE-网络原理-1初识

目录 一.网络发展史 1.独立模式 2.网络互联 二.局域网LAN 1.基于网线直连&#xff1a; 2.基于集线器组件&#xff1a; 3.基于交换机组件&#xff1a; 4.基于交换机和路由器组件 ​编辑 三、广域网WAN 四、网络通信基础 1.ip地址 2.端口号&#xff1a; 3.协议 4.五…

电子电气架构 --- 整车整车网络管理浅析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

xml格式化(3):增加头部声明

前言 这篇文章&#xff0c;是用来增加头部声明。 正文 from lxml import etreedef pretty_print(element, level0, indent" "):result ""# 判断元素是否为注释节点if isinstance(element, etree._Comment):result f"{indent * level}<!--{el…

STM32 高级 物联网通讯之LoRa通讯

目录 LoRa通讯基础知识 常见的3种通讯协议 远距离高速率的传输协议 近距离高速率传输技术 近距离低功耗传输技术 低功耗广域网 采用授权频段技术 非授权频段 LoRa简介 LoRa的特点 远距离 低功耗 安全 标准化 地理定位 移动性 高性能 低成本 LoRa应用 LoRa组…