可以/是否有WPF有多个GUI线程?

时间:2011-04-19 13:06:33

标签: .net wpf multithreading user-interface

WPF可以/有多个GUI线程吗?或者它总是只有一个GUI线程(即使我有多个窗口/对话框)?

我问,因为我有来自其他线程的事件,我想在GUI线程中处理它们(因为我需要根据事件修改主窗口的控件)。

顺便说一句:我知道我需要为此目的使用Dispatcher对象。所以,我可以重新解释一下我的问题并问:WPF中的所有GUI元素总是只有一个Dispatcher对象吗?

1 个答案:

答案 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>