QQ交流群:110826636

SynchronizationContext一篇

SynchronizationContext context; 最近写代码用到了这个,特别记录一下。

作用如下:

    // 摘要:
    //     提供在各种同步模型中传播同步上下文的基本功能。
    public class SynchronizationContext
    {
    ......
    }

来自using System.Threading;这个命名空间,一看很熟悉是线程的大类命名空间。

    // 摘要:
    //     获取当前线程的同步上下文。
    //
    // 返回结果:
    //     一个 System.Threading.SynchronizationContext 对象,它表示当前同步上下文。
    public static SynchronizationContext Current { get; }

我是在winform中使用,因为要线程之间同步,还有主线程绘图,之间用control.invoke,被大神鄙视,遂默默用起了大神推荐的SynchronizationContext。在Form初始化的时候context=SynchronizationContext.Current(实例化),

        //
        // 摘要:
        //     当在派生类中重写时,将异步消息调度到一个同步上下文。
        //
        // 参数:
        //   d:
        //     要调用的 System.Threading.SendOrPostCallback 委托。
        //
        //   state:
        //     传递给委托的对象。
        public virtual void Post(SendOrPostCallback d, object state);
        //
        // 摘要:
        //     当在派生类中重写时,将一个同步消息调度到一个同步上下文。
        //
        // 参数:
        //   d:
        //     要调用的 System.Threading.SendOrPostCallback 委托。
        //
        //   state:
        //     传递给委托的对象。
        //
        // 异常:
        //   System.NotSupportedException:
        //     在 Windows Store 应用程序中调用的方法。用于 Windows Store 应用程序的 System.Threading.SynchronizationContext
        //     的实现应用不支持 System.Threading.SynchronizationContext.Send(System.Threading.SendOrPostCallback,System.Object)
        //     方法。
        public virtual void Send(SendOrPostCallback d, object state);

上面的两个函数(方法)就是要用到的,一个是同步(阻塞),一个是异步(非阻塞),看自己的需要调用。其中SendOrPostCallback是一个委托,

    // 摘要:
    //     表示在消息即将被调度到同步上下文时要调用的方法。
    //
    // 参数:
    //   state:
    //     传递给委托的对象。
    public delegate void SendOrPostCallback(object state);

使用如下(简单粗暴lambda):

            context.Send(t =>
            {
                //操作
            }, null);
            context.Post(t =>
            {
                //操作
            }, null);

state我写一个null,是传递给那个委托的参数,可以自己选择。我是在子线程中将一个参数传递给窗体(主线程,就是我在Form得到的当前线程上下文,如果是子线程与子线程之间交流,可以在线程内调用SynchronizationContext.Current获取),然后顶一个全部的变量互相使用请求。个人感觉是很好用,很有用。不会出现句柄未创建能不良的Exception抛出。

 

posted @ 2015-10-17 16:47  FourOne  阅读(1492)  评论(1编辑  收藏  举报