1

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

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();
    }
}

我在这里做错了什么?

4

2 回答 2

3

如果你想让你的窗口存活,你必须在创建它们之后启动消息循环(否则你的线程就会退出,并且窗口没有机会呈现自己):

private void OpenSomeWindows()
{
    for (int i = 0; i < 3; i++)
    {
        TestWindow T = new TestWindow();
        T.Show();
    }
    Dispatcher.Run(); // <---------
}

(在主线程中,消息循环由框架为您创建。)

PS:我不确定窗口是否可以被垃圾收集,所以我会在某处保留对它们的引用:

List<TestWindow> windows = new List<TestWindow>();
for (int i = 0; i < 3; i++)
{
    TestWindow t = new TestWindow();
    t.Show();
    windows.Add(t);
}
Dispatcher.Run();

PPS:也许您希望您的窗口在主线程中运行?其实你可以这样做。您只需要以下内容:

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
}
于 2011-06-01T15:30:00.730 回答
0

线程在调用方法结束时死亡。做成一个字段(在ANewThread类/表单级别声明它)。

于 2011-06-01T15:29:28.833 回答