zoukankan      html  css  js  c++  java
  • SynchronizationContext(线程间通讯)

    SynchronizationContext类允许一个线程和另外一个线程进行通讯,SynchronizationContext在通讯中充当传输者的角色。
    另外这里有个地方需要清楚的,不是每个线程都附加SynchronizationContext这个对象,只有UI线程是一直拥有的。
    案例:

    private void btnTest_Click(object sender, EventArgs e)
            {
                var context = SynchronizationContext.Current;//有值
                new Thread(() =>
                {
                    var context2 = SynchronizationContext.Current;//null
                }).Start();
            }
    

    应用程序有两个线程:线程A和线程B,不过线程B比较特殊,它属于UI线程,当这两个线程同时运行的时候,线程A有个需求:"修改UI对象的属性",一般是通过Control.Invoke()方法调用

    是有一种方法,就是使用SynchronizationContext:

    private void btnTest_Click(object sender, EventArgs e)
            {
                var context = SynchronizationContext.Current;
                MessageBox.Show("主线程id:" + Thread.CurrentThread.ManagedThreadId);//1
                new Thread((state) =>
                {
    
                    MessageBox.Show("子线程id:" + Thread.CurrentThread.ManagedThreadId);//2
                    (state as SynchronizationContext).Post((arg) =>
                    {
                        MessageBox.Show("主线程id:" + Thread.CurrentThread.ManagedThreadId);//1
                        lbConsumer1.Items.Add(arg);
                    }, "222");
                }).Start(context);
            }
    

    SynchronizationContext有两个方法:
    Send是在当前线程执行的(同步)
    Post是在新的线程执行的(异步)

  • 相关阅读:
    激活
    年龄校验,精确到日
    腾讯消息队列CMQ一键化部署脚本
    腾讯消息队列CMQ部署与验证
    蓝鲸6.0.1部署
    docker离线安装
    蓝鲸平台开启consul.conf UI界面
    基于docker一键化部署LNMP环境
    阿里云镜像上传打包
    腾讯蓝鲸平台部署[5.1.29版本]
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13629322.html
Copyright © 2011-2022 走看看