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

发布于:2025-02-11 ⋅ 阅读:(53) ⋅ 点赞:(0)

(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

完事!!!
 
 


网站公告

今日签到

点亮在社区的每一天
去签到