在后台加载另一个窗口;渲染时,关闭父窗口

本文关键字:窗口 后台 加载 另一个 | 更新日期: 2023-09-27 18:22:15

我一直试图在一个窗口的后台加载另一个窗口;在我的情况下,父窗口充当启动屏幕

InitWindow I = null;
    public InitWindow()
    {
        InitializeComponent();
        I = this;
        Thread T = new Thread(() =>
        {
            MainWindow M = new MainWindow();
            M.Show();
            M.ContentRendered += M_ContentRendered;
            System.Windows.Threading.Dispatcher.Run();
            M.Closed += (s, e) => M.Dispatcher.InvokeShutdown();
        }) { IsBackground = true, Priority = ThreadPriority.Lowest };
        T.SetApartmentState(ApartmentState.STA);
        T.Start();
    }
    void M_ContentRendered(object sender, EventArgs e)
    {
        I.Close();
    }

其他一切都很好,但它在以下位置引发无效操作异常:

I.Close();

调用线程无法访问此对象,因为其他线程拥有它。

1) 如何切换/同步线程?

2) 有更好的解决方法吗?

在后台加载另一个窗口;渲染时,关闭父窗口

将代码更改为:

    InitWindow I = null;
    Thread C = null;  
    public InitWindow()
    {
        InitializeComponent();
        I = this;
        C = Thread.CurrentThread;  
        Thread T = new Thread(() =>
        {
            MainWindow M = new MainWindow();
            M.Show();
            M.ContentRendered += M_ContentRendered;
            System.Windows.Threading.Dispatcher.Run();
            M.Closed += (s, e) => M.Dispatcher.InvokeShutdown();
        }) { IsBackground = true, Priority = ThreadPriority.Lowest };
        T.SetApartmentState(ApartmentState.STA);
        T.Start();
    }
    void M_ContentRendered(object sender, EventArgs e)
    {
        // Making the parent thread background
        C.IsBackground = true; 
        // foreground the current thread
        Thread.CurrentThread.IsBackground = false;
        // Abort the parent thread
        C.Abort();
    }

目前运行良好,但我认为这不是一个可靠的解决方案。