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