首页 > 解决方案 > 为什么 WindowsFormsSynchronizationContext 需要一个名为 controlToSendTo 的私有字段?

问题描述

我已经阅读WindowsFormsSynchronizationContext.

整个 Winform 基本上运行在一个称为“UI 线程”的线程上。这就是为什么另一个线程在完成后必须回到特定线程的原因。并且WindowsFormsSynchronizationContext基本上将消息(操作)发送到队列并等待它被调用。那么,label1 发送消息和 button1 有什么区别呢?这private Control controlToSendTo门课有必要吗?

//below methods have the same effect
button1.Invoke(new Action(() => label1.Text = "hello"));
label1.Invoke(new Action(() => label1.Text = "hello"));

标签: c#winforms

解决方案


Winforms 很奇怪,因为您可以有多个 UI 线程,但每个线程都Control与单个 UI 线程相关联。这意味着一个控件可能与一个线程相关联,但不同的控件与不同的线程相关联。

将消息发布到给定 UI 线程的方法是找到与该线程关联的控件,并调用其Invoke方法。

当一个newWindowsFormsSynchronizationContext被创建时,它会创建一个 new ,它是一个与当前线程相关联MarshalingControl的虚拟对象。Control当您发布到该 SynchronizationContext 时,它会调用它之​​前创建的那个MarshalingControl,以便发布到它之前与该控件关联的线程。


推荐阅读