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

原文地址:https://www.cnblogs.com/fanfan-90/p/13629322.html