WPF可以/有多个GUI线程吗?或者它总是只有一个GUI线程(即使我有多个窗口/对话框)?
我问,因为我有来自其他线程的事件,我想在GUI线程中处理它们(因为我需要根据事件修改主窗口的控件)。
顺便说一句:我知道我需要为此目的使用Dispatcher
对象。所以,我可以重新解释一下我的问题并问:WPF中的所有GUI元素总是只有一个Dispatcher
对象吗?
答案 0 :(得分:30)
根据第一个答案中的链接,我自己做了一些验证。我想在这里分享结果。首先:
可以有多个GUI线程(以及多个Dispatcher
个实例)。
然而:
只需创建一个新窗口(模态与否)不会创建新的GUI线程。需要显式创建线程(通过创建{的新实例{1}})。
注意:使用Dispatcher.PushFrame()来阻止此方法的调用者,同时仍然允许调度事件,而不是使用单独的线程,可能会实现模态对话框。
我已经创建了一个简单的WPF类(再次,基于第一个答案的链接)来验证所有这些东西。我在这里分享,所以你可以稍微玩一下。
MainWindow.xaml:
Thread
MainWindow.xaml.cs:
<Window x:Class="WindowThreadingTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="250" Height="130">
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Thread's ID is "/>
<TextBlock x:Name="m_threadId"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Thread's threading apartment is "/>
<TextBlock x:Name="m_threadTA"/>
</StackPanel>
<Button Click="OnCreateNewWindow" Content="Open New Window"/>
<Button Click="OnAccessTest" Content="Access Test"/>
</StackPanel>
</Window>