同步上下文 SynchronizationContext

非UI线程需要将对UI元素的所有更改安排到UI线程。这就是同步上下文提供的内容。它允许将一个工作单元(执行某些方法)发布到不同的上下文 - 在这种情况下是UI线程。无论使用哪种平台(ASP.NET 、WinForm 、WPF 等),所有.NET程序都包含同步上下文的概念。Microsoft .NET Framework提供了同步上下文的SynchronizationContext类。但是该类并不仅仅用于UI线程,理论上任何线程都可以使用。

public static SynchronizationContext UiSynchronizationContext { get; set; }
if (UiSynchronizationContext == null)
{
    UiSynchronizationContext = SynchronizationContext.Current;
}

SynchronizationContext.Send(SendOrPostCallback d,object state);

SynchronizationContext.Post(SendOrPostCallback d,object state);

    private SynchronizationContext context;

    private void Form1_Load(object sender, EventArgs e)
    {
        //此处就是之前提的在主线程获得SynchronizationContext
        context = SynchronizationContext.Current;
        //之后可以开线程了
        Thread thread = new Thread(new ThreadStart(Start));
        thread.IsBackground = true;
        thread.Start();
    }

    private void Start()
    { 
        for(int i=0;i<100;++i)
        {
            //这边即可正常调用主界面的控件了
            context.Send(operation, i);//正确
            //按原先直接应用,因为使用到控件会报错
            operation(i);//报错
            Thread.Sleep(100);
        }
    }

    private void operation(object obj)
    {
        textBox1.AppendText(obj.ToString() + "\r\n"); 
    }

SynchronizationContext.Current

此属性可用于将同步上下文从一个线程传播到另一个线程。