Bootstrap
本文主要介绍一下C#中同步上下文(SynchronizationContext),和同步上下文中的Send方法和Post使用总结。

1、(SynchronizationContext)同步上下文的作用

SynchronizationContext其实就是实现线程之间通讯的。

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

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

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

看了一些解释Send和Post方法,感觉弄得很复杂,我感觉其实简单来说,

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

4、示例代码

1)(SynchronizationContext)同步上下文使用示例代码

using System;
using System.Threading;
namespace SynchronizationContextExample
{
    public class MySynchronizedClass
    {
        private Thread workerThread;
        private SynchronizationContext context;
        public event EventHandler SomethingHappened;
        public MySynchronizedClass()
        {
         //获取当前SynchronizationContext非常重要对象在构造函数中。我们想要的
         //属于线程的SynchronizationContext对象
         //这个对象正在被创建。
         //context= SynchronizationContext.Current;当前线程可能没有SynchronizationContext对象;该线程尚未为设置SynchronizationContext对象。
         //如果是这样,我们可以通过创建SynchronizationContext来简化
            if(context == null)
            {
                context = new SynchronizationContext();
            }
            workerThread = new Thread(new ThreadStart(DoWork));
            workerThread.Start();
        }
        private void DoWork()
        {
            context.Post(new SendOrPostCallback(delegate(object state)
            {
                EventHandler handler = SomethingHappened;
                if(handler != null)
                {
                    handler(this, EventArgs.Empty);
                }
            }), null);
        }
    }
}

2)使用AsyncOperation和AsyncOperationManager类示例代码

using System;
using System.Threading;
using System.ComponentModel;
namespace SynchronizationContextExample
{
    public class MySynchronizedClass
    {
        private Thread workerThread;
        private AsyncOperation operation;
        public event EventHandler SomethingHappened;
        public MySynchronizedClass()
        {
            operation = AsyncOperationManager.CreateOperation(null);
            workerThread = new Thread(new ThreadStart(DoWork));
            workerThread.Start();
        }
        
        private void DoWork()
        {
            operation.Post(new SendOrPostCallback(delegate(object state)
            {
                EventHandler handler = SomethingHappened;
                if(handler != null)
                {
                    handler(this, EventArgs.Empty);
                }
            }), null);
            operation.OperationCompleted();
        }
    }
}