WPF多线程是如何工作的?

4

我了解WPF中多线程的基本构建块,但是我有一个问题让我感到困惑。

WPF应用程序开始时会有两个线程:

一个用于处理渲染,另一个用于管理UI。

这听起来不错,但UI线程让我困扰,UI线程实际上就是应用程序线程

创建WPF UI元素的线程拥有这些元素,其他线程无法直接与UI元素交互,这被称为线程亲和性。

假设我的应用程序中有两个文本框和一个按钮,并且每个文本框都有自己的 DispatcherObject ,在按钮单击时,我将使用值更新文本框,希望这将由 UI线程 完成。

1.现在,我的问题是UI线程是应用程序线程,按钮将有其自己的 DispatcherObject ,而两个文本框将有其自己的 DispatcherObject ,那么这个具有其自己的 DispatcherObject 且与这些UI控件的DispatcherObject不同的UI线程如何更新文本框?

  1. 我的另一个问题是,如果在后台线程中创建新的文本框,那么我能否从UI线程更新此文本框?

请纠正我的理解,我无法继续进行。


这听起来真的很令人困惑。请创建一个具体的示例,展示您的问题。 - Daniel Hilgarth
@DanielHilgarth,您能告诉我哪一部分令人困惑吗? - Selva
1个回答

2
每个DispatcherObject都与一个UI线程相关联。只有该线程才能访问该特定的DispatcherObject。在合理架构的WPF应用程序中,只有一个UI线程。所有元素都在那里创建和访问。
您可以拥有多个具有不同元素集的UI线程,但这将是一个神秘的场景,会带来很多问题。
如果在后台线程中创建新的文本框,则该文本框将绑定到后台线程,并且只能在那里使用。因此,您无法将其挂接到主元素树中。它将是无用的。

你的意思是说UI线程可以更新其所有UI元素,即使UI元素(文本框、按钮等)的Dispatcher对象与UI线程的Dispatcher对象不同?如果是这样,请问对于textbox1,我可以通过两种方式更新它,一种是通过UI线程的Dispatcher对象,另一种是通过textbox1的Dispatcher对象。请纠正我。 - Selva
我不知道多个调度程序的情况。通常,每个线程有一个调度程序。我不知道它是否会有所不同。即使可以,似乎也是不必要的复杂化。一般规则是,如果你现在不在那个分派程序的线程上,你需要调用拥有该对象的分派程序。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接