Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF线程实践_C#_Wpf_Multithreading_Dispatcher - Fatal编程技术网

C# WPF线程实践

C# WPF线程实践,c#,wpf,multithreading,dispatcher,C#,Wpf,Multithreading,Dispatcher,我对WPF有些陌生,但我的理解是默认情况下WPF应用程序有两个线程;一个用于UI,一个用于管理。对吗 在我的main窗口中说会在自己的线程中生成其他窗口。因此,我创建了一个新线程,并在该线程中创建了Foo1(定义为classfoo1:Window)的实例。然后创建另一个线程,并创建一个Foo2实例,等等(我这样做的想法是,因为这些窗口中的每一个都做了一些密集的事情,也许它们应该在自己的线程上) 我想我的问题有两个方面: a) 这是过度使用还是我应该简单地从MainWindow在同一个线程中实例化

我对WPF有些陌生,但我的理解是默认情况下WPF应用程序有两个线程;一个用于UI,一个用于管理。对吗

在我的
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线程(因为它们在自己的线程中运行)?