zoukankan      html  css  js  c++  java
  • 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抛出。

  • 相关阅读:
    POJ3345 Bribing FIPA(树形DP)
    POJ3294 Life Forms(二分+后缀数组)
    ZOJ1027 Travelling Fee(DP+SPFA)
    POJ2955 Brackets(区间DP)
    POJ1655 Balancing Act(树的重心)
    POJ2774 Long Long Message(后缀数组)
    URAL1297 Palindrome(后缀数组)
    SPOJ705 SUBST1
    POJ3261 Milk Patterns(二分+后缀数组)
    POJ1743 Musical Theme(二分+后缀数组)
  • 原文地址:https://www.cnblogs.com/RainbowInTheSky/p/4887688.html
Copyright © 2011-2022 走看看