wpf - 如何在单独的线程上创建和显示 WPF 窗口?

标签 wpf multithreading

我需要从同一进程创建两个(或更多)WPF 窗口。但是窗口必须由单独的线程处理,因为它们不应该能够相互阻塞。我该怎么做?

在 WinForms 中,这是通过以下方式实现的:

  • 开始一个新话题
  • 从新线程创建表单
  • 使用表单作为参数调用 Application.Run

但是我如何在 WPF 中执行相同的操作?

最佳答案

msdn状态:

private void NewWindowHandler(object sender, RoutedEventArgs e)
{       
    Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
    newWindowThread.SetApartmentState(ApartmentState.STA);
    newWindowThread.IsBackground = true;
    newWindowThread.Start();
}

private void ThreadStartingPoint()
{
    Window1 tempWindow = new Window1();
    tempWindow.Show();       
    System.Windows.Threading.Dispatcher.Run();
}

编辑: 这是一个旧答案,但由于它似乎经常被访问,我还可以想到以下修改/改进(未测试)。

如果您想关闭这样的窗口,只需从线程(委托(delegate))外部保留对 Window 对象的引用,然后对其调用 close ,如下所示:

void CloseWindowSafe(Window w)
{
    if (w.Dispatcher.CheckAccess())
        w.Close();
    else
        w.Dispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(w.Close));
}

// ...
CloseWindowSafe(tempWindow);

如果新线程可能被终止(强制中止),与评论中的问题一致:

private void ThreadStartingPoint()
{
    try{
        Window1 tempWindow = new Window1();
        tempWindow.Show();       
        System.Windows.Threading.Dispatcher.Run();
    }
    catch(ThreadAbortException)
    {
        tempWindow.Close();
        System.Windows.Threading.Dispatcher.InvokeShutdown();
    }
    //the CLR will "rethrow" thread abort exception automatically
}

免责声明:不要在家里这样做,中止线程(几乎总是)违反最佳实践。线程应该通过任何各种同步技术来优雅地处理,或者在这种情况下,只需通过调用 window.Close()

关于wpf - 如何在单独的线程上创建和显示 WPF 窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1111369/

相关文章:

c# - WPF:无法在属性元素怪异上设置属性

wpf - 如何在DataGrid分组中自定义组标题?

java - 线程安全的排序链表

C/线程,返回值

multithreading - Nodejs中的单线程是什么意思

c# - WPF:绑定(bind)到自定义类属性。 PropertyChanged 已触发但 View 未更新

c# - Dispatcher.Invoke on application idle on button click - 我的 UI 是否卡住/阻塞

c# - 在 WPF 或控制台 C# 应用程序中接收 WM_COPYDATA 结构

java - 我没有在 Tomcat 中的 Web 应用程序的线程中获取 Hibernate session

c# - 从不同线程调用方法