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是在新的线程执行的(异步)

  • 相关阅读:
    无语的Filezilla
    服务无法启动集中帖
    FileZilla Server-Can’t access file错误解决方法
    CCNA2.0笔记_OSPF v3
    CCNA2.0笔记_OSPF v2
    <转>32位移植到64位 注意事项
    异步设备IO 《windows核心编程》第10章学习
    关于自己五年来做出的选择分析
    2015过年之前计划
    关于同一线程两次调用EnterCriticalSection的测试
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13629322.html
Copyright © 2011-2022 走看看