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

  • 相关阅读:
    java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    ElasticSearch读取查询结果(search)
    Oracle合并某一列
    Django在Eclipse下配置启动端口号
    Apache部署django项目
    Apache的下载安装(主要说的 64位)及问题
    windows7下怎样安装whl文件(python)
    windows下面安装Python和pip终极教程
    Java 多线程 并发编程 (转)
    数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
  • 原文地址:https://www.cnblogs.com/RainbowInTheSky/p/4887688.html
Copyright © 2011-2022 走看看