• System.ComponentModel下有一个抽象类:SynchronizationConetxt,它使得Thread Marshaling(线程封送处理:数据的所有权,从一个线程交给另一个线程)得到泛化。
    • 针对富客户端应用,移动、桌面(WPF,UWP,WinForms)等富客户端应用的API,它们都定义和实例化了SynchronizationContext的子类。

      • 可以通过静态属性SynchronizationContext.Current来获得(当运行在UI线程时)
      • 捕获该属性让你可以在稍后的时候从worker线程向UI线程发送数据(例子)

        1. public partial class MainForm : Form
        2. {
        3. private SynchronizationContext _uiSyncContext;
        4. public MainForm()
        5. {
        6. InitializeComponent();
        7. _uiSyncContext = SynchronizationContext.Current;
        8. new Thread(Worker).Start();
        9. }
        10. void Worker()
        11. {
        12. Thread.Sleep(5000);
        13. UpdateMessage("The answer!");
        14. }
        15. private void UpdateMessage(string message)
        16. {
        17. _uiSyncContext.Post(_ => txtMsg.Text = message, null);
        18. }
        19. }
      • 调用Post就相当于调用Sispatch或Control上面的BeginInvoke方法

      • 还有一个Send方法,它等价于Invoke方法