码迷,mamicode.com
首页 > 其他好文 > 详细

SynchronizationContext一篇

时间:2015-10-17 17:36:58      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

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抛出。

 

SynchronizationContext一篇

标签:

原文地址:http://www.cnblogs.com/RainbowInTheSky/p/4887688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!