Wpf 如何防止新STA线程上的非模式窗口关闭

Wpf 如何防止新STA线程上的非模式窗口关闭,wpf,multithreading,modeless,Wpf,Multithreading,Modeless,我想打开一些非模型窗口(WPF),但在这一点上,这必须发生,我在一个非STA线程。因此,我开始一个新的线程,并在那里打开它们。但一旦打开,它们就会再次关闭。(顺便说一句。这些窗口的行为应该独立于主窗口。因此没有设置所有者属性) private void SomeMethod\u OnA\u NON\u STA\u Thread() { //这里还有其他工作吗 线程ANewThread=新线程(OpenSomeWindows); SetApartmentState(ApartmentState.S

我想打开一些非模型窗口(WPF),但在这一点上,这必须发生,我在一个非STA线程。因此,我开始一个新的线程,并在那里打开它们。但一旦打开,它们就会再次关闭。(顺便说一句。这些窗口的行为应该独立于主窗口。因此没有设置所有者属性)

private void SomeMethod\u OnA\u NON\u STA\u Thread()
{
//这里还有其他工作吗
线程ANewThread=新线程(OpenSomeWindows);
SetApartmentState(ApartmentState.STA);
ANewThread.Start();
}
私有void OpenSomeWindows()
{
测试窗口T;
对于(int i=0;i<3;i++)
{
T=新的测试窗口();
T.Show();
}
}

我在这里做错了什么?

线程在调用方法结束时终止。将
ANewThread
设置为一个字段(在类/窗体级别声明它)。

如果希望windows处于活动状态,则必须在创建它们后启动消息循环(否则线程将退出,而窗口将无法呈现它们自己):

private void OpenSomeWindows()
{
对于(int i=0;i<3;i++)
{
TestWindow T=新的TestWindow();
T.Show();
}

Dispatcher.Run();//Thx!!!!!现在它可以工作了。我再次发现我必须阅读更多关于这个Dispatcher的内容。最后一次迭代:(Application.Current.Dispatcher.Invoke(OpenSomeWindows);)是(IMHO)跨不同线程处理UI的最佳方法,尤其是当您试图快速编写某些内容,并且不想学习或重新学习线程时。我知道这很糟糕,但对于原型和小项目,有时您只需要一些有效的东西,这就是。
private void SomeMethod_OnA_NON_STA_Thread()
{
    // some other work here

    Thread ANewThread = new Thread(OpenSomeWindows);
    ANewThread.SetApartmentState(ApartmentState.STA);
    ANewThread.Start();
}


private void OpenSomeWindows()
{
    TestWindow T;

    for (int i = 0; i < 3; i++)
    {
        T = new TestWindow();
        T.Show();
    }
}
private void OpenSomeWindows()
{
    for (int i = 0; i < 3; i++)
    {
        TestWindow T = new TestWindow();
        T.Show();
    }
    Dispatcher.Run(); // <---------
}
List<TestWindow> windows = new List<TestWindow>();
for (int i = 0; i < 3; i++)
{
    TestWindow t = new TestWindow();
    t.Show();
    windows.Add(t);
}
Dispatcher.Run();
private void SomeMethod_OnA_NON_STA_Thread()
{
    // some other work here
    Application.Current.Dispatcher.Invoke(OpenSomeWindows);
}

private void OpenSomeWindows()
{
    for (int i = 0; i < 3; i++)
    {
        TestWindow T = new TestWindow();
        T.Show();
    }
    // this way, no Dispatcher.Run is needed
}