(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); // 10Console.ReadLine();}}
SynchronizationContext 的注意事项
- 上下文切换:在某些情况下,你可能需要在不同的上下文之间切换。例如,从非 UI 线程切换回 UI 线程以更新界面。
- 性能考虑:频繁地在上下文之间切换可能会带来性能开销,因此在设计时应尽量减少不必要的上下文切换。
- 手动上下文管理:如果你需要更细粒度地控制上下文,可以实现自己的SynchronizationContext 类,并覆盖其方法。
借鉴网站:
C# 异步编程中的 SynchronizationContext:掌握上下文同步的艺术_c# synchronizationcontext-CSDN博客
SynchronizationContext 类 (System.Threading) | Microsoft Learn
完事!!!