C# SynchronizationContext线程上下文简单说明

C#—SynchronizationContext实战指南:线程间通信与异步回调优化 本文深入解析C#中SynchronizationContext的核心机制与实战应用。作为线程间通信的标准化中介,它通过Send(同步)和Post(异步)方法,优雅解决了跨线程更新UI等经典问题,实现了业务逻辑与线程上下文的解耦。文章结合WinForms和WPF实例,详细展示了如何捕获上下文、优化异步回调以及避免死锁和性能陷阱,并进阶演示了如何实现自定义SynchronizationContext以满足特定调度需求。 阅读详情

SynchronizationContext线程上下文说明
SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯
 那么SynchronizationContext的Send()和Post()
  Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。
 Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。

 	SynchronizationContext.Send(SendOrPostCallback d,object state);
  SynchronizationContext.Post(SendOrPostCallback d,object state);

测试代码:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ContextTest
{
    class Program
    {

        static SynchronizationContext context;

        // 线程同步队列,发送接收socket回调都放到该队列,由poll线程统一执行
        //private  ConcurrentQueue<Action> queue = new ConcurrentQueue<Action>();
        /// <summary>
        /// 测试上下文同步
        /// SynchronizationContext
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {

            context = new SynchronizationContext();
            Console.WriteLine("主线程id:"+Thread.CurrentThread.ManagedThreadId);
            TestThread();
            Thread.Sleep(6000);
            Console.WriteLine("主线程执行");
            context.Send(EventMethod, "Send");
            context.Post(EventMethod, "Post");
            Console.WriteLine("主线程结束");
        }


        static void TestThread()
        {
            var thrd= new Thread(Start);
            thrd.Start();

        }

        static void Start()
        {
             
            Console.WriteLine("子线程id:" + Thread.CurrentThread.ManagedThreadId);
            context.Send(EventMethod, "子线程Send");
            context.Post(EventMethod, "子线程Post");
            Console.WriteLine("子线程结束");
        }


        static void EventMethod(object arg)
        {

            Console.WriteLine("CallBack::当前线程id:" + Thread.CurrentThread.ManagedThreadId+"     arg:"+(string)arg);


        }
    }
}

结果:
在这里插入图片描述

根据结果分下得出:
Send是在当前线程执行的(同步)
Post是在新的线程执行的(异步)
其它的不同后面再补充

参考文章
梦琪小生
【C#】【Thread】SynchronizationContext线程间同步

C#—SynchronizationContext类详解 (同步上下文) SynchronizationContext 顾名思义是同步上下文的意思。利用此对象可以实现线程间数据的同步、异步访问 ,其实就是实现线程之间通讯的。 阅读详情

相关推荐

C#异步编程深度解析:状态机、ExecutionContext与SynchronizationContext

异步编程是现代高性能.NET应用的基石,其核心在于理解任务(Task)如何抽象异步操作、await如何通过编译器生成状态机实现协程式控制流。本文从TAP模式出发,深入剖析async/await背后的三大关键技术支柱:状态机(编译器自动生成的IAsyncStateMachine)、ExecutionContext(保障安全上下文跨await传递)以及SynchronizationContext(决定代码恢复执行的线程环境)。结合ASP.NET Core高并发场景与WPF UI响应性需求,揭示Configure

dejz8829的专栏 528

c#:深入理解SynchronizationContext

环境: window10 vs2019 .net core 3.1 dnSpy v6.1.4 (.NET Core) ILSpy版本6.1.0.5902 一、为什么需要SynchronizationContext? 问题是这样的:在winform中窗体的控件都是由UI线程创建的,当我们点击按钮后如果有耗时操作的话,我们肯定需要单独启动线程去运算,运算完了之后又要访问窗体控件将结果显示出来,但因为窗体控件是由UI线程创建的,所以,winform仅允许我们在UI线程中取操纵窗体控件。 所以有了下面的常见代码

火焰 9167

使用C#了解.NET中的SynchronizationContext

控制您的代码在哪个线程上执行以及如何执行

同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结

在C#编程环境中,不允许在工作线程中直接对主线程(UI线程)中的控件进行更新操作。因此,稍微复杂一点的程序,跨线程更新UI界面是非常常见的。目前,一般有以下几种方法可以实现在工作线程对UI控件的更新: 通过UI线程的SynchronizationContext的Post/Send方法更新 通过UI控件的Invoke/BeginInvoke方法更新 通过BackgroundWorker取代Thread执行异步操作 通过取消线程安全检查来避免"跨线程操作异常" 1 通过UI线程的SynchronizationC

kalvin_y_liu的博客 7522

网易 广州 梦幻西游端游 客户端社招笔试题 2024

4道算法题,时间2小时,牛客网笔试注:采用OJ模式,需要自己处理输入、输出。

z2014z的博客 1812

Meta DINOv3实战指南:如何用7B参数ViT模型搞定图像分割与检测(附Hugging Face配置)

本文提供了Meta DINOv3模型的实战应用指南,重点介绍了如何利用这个7B参数的视觉Transformer模型进行图像分割与目标检测。通过详细的Hugging Face配置步骤、环境搭建、模型加载与推理优化,帮助开发者快速上手这一强大的自监督视觉模型,并高效应用于实际计算机视觉任务中。

s3t4u的博客 903

【C#】SynchronizationContext线程上下文简单说明

Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。SynchronizationContext在通讯中充当传输者的角色,实现功能就是一个线程和另外一个线程的通讯。Send是在当前线程执行的(同步)Post是在新的线程执行的(异步)

weixin_46472622的博客 763

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 483

C# SynchronizationContext以及Send和Post使用总结

本文主要介绍一下C#中同步上下文(SynchronizationContext),和同步上下文中的Send方法和Post使用总结。 1、(SynchronizationContext)同步上下文的作用 SynchronizationContext其实就是实现线程之间通讯的。 2、创建(SynchronizationContext)同步上下文的方法 1)直接new创建一个Synchro...

qq_41231360的博客 7071

SAP FICO 资产会计AA后台配置 (上)

输入折旧表“CZ11”如有外币计价的资产,则需指定外币计价的资产折旧范围,以及规则。因为在设置资产类型时,需指定一个对应的 资产编号范围、资产账户确定类型(便于分配自动会计科目)、屏幕格式规则(便于设置资产字段必填与否)。因为在设置资产类型时,需指定一个对应的 资产编号范围、资产账户确定类型(便于分配自动会计科目)、屏幕格式规则(便于设置资产字段必填与否)。新增资产类型:Z101 固定资产-房屋及建筑物新增资产类型:Z301 固定资产-房屋及建筑物。

ghgxm520的博客 1761

保姆级教程:用CANoe手把手复现ECU刷写全流程(含BootLoader三阶段详解)

本文提供了一份详细的CANoe ECU刷写实战指南,涵盖BootLoader三阶段的深度解析。从实验环境搭建到预编程、主编程及后编程阶段,逐步讲解ECU刷写的关键步骤和隐藏逻辑,特别强调UDS诊断和CAN通信的精确控制,帮助开发者掌握ECU刷写的核心技术。

weixin_29234423的博客 528

C#—SynchronizationContext实战指南:线程间通信的艺术

本文深入解析C#中SynchronizationContext(同步上下文)的核心机制与应用。通过对比Post与Send方法的差异,并结合WinForms/WPF实战案例,阐述了如何利用这一“线程邮局”模型安全、优雅地实现线程间通信与UI更新。文章还探讨了自定义上下文、单元测试模拟及常见避坑指南,是掌握C#异步编程中线程同步艺术的实用指南。

whisky的博客 868

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

【从零开始学习 SystemVerilog】1.1、SystemVerilog 概述

努力,加油每一天鸭~ 1037

C# 异步编程中的 SynchronizationContext:掌握上下文同步的艺术

异步编程是现代软件开发中不可或缺的一部分,尤其是在处理高负载和多任务环境下的应用程序时。为了保证异步操作能够在正确的上下文中执行,类提供了强大的支持。本文将深入探讨的核心概念、属性和方法,并通过实际示例来展示如何在 C# 中有效地使用来确保异步任务在合适的上下文中执行。通过本文,你将学会如何更好地管理和协调异步操作,提升应用程序的性能和用户体验。在异步编程中,类是一个非常重要的概念,它负责管理异步操作的执行上下文。允许你控制异步任务何时以及在哪里执行,特别是在需要更新 UI 或与其他特定上下文交互的情况下。

jianglq的博客 2512

【软件系统架构】系列六:MBSE(基于模型的系统工程)

基于模型的系统工程(MBSE)是一种以模型为核心的系统工程方法论,通过结构化、可视化的模型取代传统文档,实现从需求到验证的全生命周期管理。MBSE采用SysML建模语言,包含需求、功能、架构和验证四大要素,支持自动追踪、仿真分析和代码生成。相比文档式工程,MBSE具有变更影响自动分析、跨团队协作和高可视化等优势,广泛应用于航空航天、汽车电子等领域。典型开发流程包括需求建模、行为建模、架构建模等阶段,配合MagicDraw、Cameo等工具链实现。MBSE正与数字孪生、AI技术融合,推动自动化建模和智能验证的

moton2017的博客 2783

KylinOS 离线安装 MinIO【图文步骤】

在国产操作系统 KylinOS 中安装 MinIO,详细步骤...

甘蓝的专栏 1534

C#线程UI更新,SynchronizationContext方法

找了很多C#线程更新UI的方法,还是这个最好用。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Thr

烽火云烟博客 1784

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SynchronizationContext(同步上下文)综述

>>返回《C# 并发编程》 1. 概述 2. 同步上下文 的必要性 2.1. ISynchronizeInvoke 的诞生 2.2. SynchronizationContext 的诞生 3. 同步上下文 的概念 4. 同步上下文 的实现 4.1. WinForm 同步上下文 4.2. Dispatcher 同步上下文 4.3. Default 同步上下文 4.4. 上下...

imherer的博客 2796

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# .NET 使用SynchronizationContext访问主线程

测试运行36小时,未发生异常.且软件效果流畅。

资深全栈开发工程师 1084

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

详解 SynchronizationContext

详解 SynchronizationContext 本人查阅了许许多多的中文资料,始终没有找到一个合适的介绍,直到我找到了这篇将得透透的英文参考才明白**SynchronizationContext**到底是个啥玩意。

shizuguilai的博客 2008

浅谈C#之SynchronizationContext

是一个抽象类,它提供了一种机制,允许代码与创建它的线程同步。这在UI编程中非常有用,比如在Windows Forms或WPF应用程序中,你可能需要确保某些操作在UI线程上执行,以避免跨线程操作导致的问题。

a876106354的博客 1238

C# Task 与 SynchronizationContext

示例代码输出结果。

磨刀不误砍柴工 551

c#同步上下文SynchronizationContext学习笔记

https://www.cnblogs.com/weifeng123/p/10039100.html 提供在各种同步模型中传播同步上下文的基本功能。同步上下文的工作就是确保调用在正确的线程上执行。 同步上下文的基本操作 Current获取当前同步上下文 var context = SynchronizationContext.Current; Send一个同步消息调度到一个同步上下文。 SendOrPostCallback callback = o => ...

zunguitiancheng的专栏 594

C# dotnet 自己实现一个线程同步上下文

昨天鹏飞哥问了我一个问题,为什么在控制台程序的主线程等待某个线程执行完成之后回来,是在其他线程执行的。而 WPF 在等待某个线程执行完成之后,可以回到主线程执行。其实这是因为在 WPF 和 WinForms 和 ASP.NET 框架里面都自己实现了线程同步上下文,通过线程同步上下文做到调度线程执行。本文就来和小伙伴聊一下如何自己实现一个线程同步上下文 我昨天和鹏飞哥说的时候感觉特别绕,但是实...

lindexi 1733

关于c#异步编程时的同步上下文的的理解SynchronizationContext

在程序开发时,尤其是在UI线程中开启异步调用(async/await)时,在await执行时,程序会自动将当前UI主线程的上下文传递给异步线程,同时将await后面的代码通过委托传递的方式传递过去。在主线程中避免使用Task.Result或Task.Wait方法,这两个方法是阻塞的,如果使用了这两个方法同步等待异步结果,那么很容易出现死锁,因为异步线程执行完成后,是要返回到主线程的同步上下文的,而此时主线程还在阻塞等待,就会出现死锁。同步模型的提供程序可以扩展此类,并为这些方法提供自己的实现。

zwl110416的博客 301
上一篇: C# async与await的使用说明
下一篇: C# 6 字符串插值(使用前缀$)
 codingriver
博客等级 码龄8年 93粉丝 62原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值