C# WPF线程实践
我对WPF有些陌生,但我的理解是默认情况下WPF应用程序有两个线程;一个用于UI,一个用于管理。对吗 在我的C# WPF线程实践,c#,wpf,multithreading,dispatcher,C#,Wpf,Multithreading,Dispatcher,我对WPF有些陌生,但我的理解是默认情况下WPF应用程序有两个线程;一个用于UI,一个用于管理。对吗 在我的main窗口中说会在自己的线程中生成其他窗口。因此,我创建了一个新线程,并在该线程中创建了Foo1(定义为classfoo1:Window)的实例。然后创建另一个线程,并创建一个Foo2实例,等等(我这样做的想法是,因为这些窗口中的每一个都做了一些密集的事情,也许它们应该在自己的线程上) 我想我的问题有两个方面: a) 这是过度使用还是我应该简单地从MainWindow在同一个线程中实例化
main窗口中说
会在自己的线程中生成其他窗口。因此,我创建了一个新线程,并在该线程中创建了Foo1
(定义为classfoo1:Window
)的实例。然后创建另一个线程,并创建一个Foo2实例,等等(我这样做的想法是,因为这些窗口中的每一个都做了一些密集的事情,也许它们应该在自己的线程上)
我想我的问题有两个方面:
a) 这是过度使用还是我应该简单地从MainWindow
在同一个线程中实例化Foo1
、Foo2
、Foo3
b) 如果不是过度,我如何安全地更新我的UI。对每个窗口中的UI元素所做的更改是否需要放置在调度程序中才能进入单个UI线程?a)一般来说,这样做太过分了。我见过的所有非常大的WPF应用程序都是用一个UI线程构建的,所以在一般情况下,我认为这是不必要的。您可能会发现使用一个线程的特殊情况,但如果您经常使用新线程,我建议可能会出现设计问题
我在过去使用过第二个UI线程,当时我的主窗口正在做许多必须在dispatcher上完成的工作,我需要一个响应的加载指示器。在这种情况下,我用指示器在自己的线程上创建了第二个窗口,并将其放置在顶部。但99%的时间都不需要
b) 没错。每个窗口(实际上,每个从DispatcherObject派生的对象)都有一个Dispatcher属性,该属性将允许您访问当前窗口的Dispatcher。您会发现,当调用代码来更新另一个窗口时,必须获取该窗口的调度程序并调用它 a)一般来说,这是过分的。我见过的所有非常大的WPF应用程序都是用一个UI线程构建的,所以在一般情况下,我认为这是不必要的。您可能会发现使用一个线程的特殊情况,但如果您经常使用新线程,我建议可能会出现设计问题
我在过去使用过第二个UI线程,当时我的主窗口正在做许多必须在dispatcher上完成的工作,我需要一个响应的加载指示器。在这种情况下,我用指示器在自己的线程上创建了第二个窗口,并将其放置在顶部。但99%的时间都不需要
b) 没错。每个窗口(实际上,每个从DispatcherObject派生的对象)都有一个Dispatcher属性,该属性将允许您访问当前窗口的Dispatcher。您会发现,当调用代码来更新另一个窗口时,必须获取该窗口的调度程序并调用它 谢谢你的详尽回答。为了澄清(b),我想知道是否需要在每个窗口类中向UI元素发送更新。或者如果我有一个Window.Label(或其他什么),即使每个Window类位于不同的线程上,在每个Window类中修改它是否安全?这取决于如何调用窗口中的代码。如果Window1上的按钮单击处理程序更改了Window1上的标签,则可以。如果单击Window1上的按钮调用Window2上的方法,而Window2的方法更改了标签,那么这将是一个问题。那么每个窗口类是否都有一个UI线程(因为它们在自己的线程中运行)?感谢您的详细回答。为了澄清(b),我想知道是否需要在每个窗口类中向UI元素发送更新。或者如果我有一个Window.Label(或其他什么),即使每个Window类位于不同的线程上,在每个Window类中修改它是否安全?这取决于如何调用窗口中的代码。如果Window1上的按钮单击处理程序更改了Window1上的标签,则可以。如果单击Window1上的按钮调用Window2上的方法,而Window2的方法更改了标签,那么这将是一个问题。那么每个窗口类是否有一个UI线程(因为它们在自己的线程中运行)?