none
如何在线程中将当前窗体关闭? RRS feed

  • 问题

  • 窗体(WPF)打开之后,会启动一个线程,这个线程在执行完毕之后需要关闭当前窗口,我的代码如下:

                Thread thread = new Thread(new ParameterizedThreadStart(MyThreadProc));
                thread.Start(this);
    

    然后在MyThreadProc:

    public void MyThreadProc(Object form) {

    //线程代码.............

    Console.WriteLine("已经结束");

    Dispatcher.CurrentDispatcher.Invoke(() => { ((Window)form).Close(); }); }


    虽然使用了Invoke,但是仍然报”线程不拥有该对象“的错误:

    请问应该如何关闭窗体?



    da jia hao!

    2020年10月16日 7:16

全部回复

  •  var th = new Thread(() =>
                {
                    Thread.Sleep(2000);
    
    
                    Dispatcher.Invoke(new Action(() =>
                    {
                        Close();
                    }));
                });
    
                th.Start();
    我尝试了winform,wpf 此代码均能在2秒后关闭,并没有错误
    2020年10月16日 8:37
  • 你好,

    你可以修改你的MyThreadProc代码如下:

     public void MyThreadProc(Object form)
            {
                //线程代码.............
                Console.WriteLine("已经结束");
    
                Dispatcher.Invoke(new Action(() =>
                {
                    ((Window)form).Close();
                }));
            }

    谢谢

    Daisy Tian


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年10月19日 6:28
  • 我的线程的源代码是写在另外一个cs文件里面的(是为了单独封装的缘故),和窗体的代码不在一起,不能使用:

    Dispatcher.Invoke

    而只能够使用:Dispatcher.CurrentDispatcher.Invoke,所以还是出错。

    是不是线程代码不在窗体代码里面就不行呢?


    da jia hao!

    2020年10月20日 7:45
  • 你好,

    我们不能在次线程上再调用次线程的委托函数来更新主线程的UI。但是我们可以创建一个线程来关闭主窗体:

     Thread threadFingerRegister = new Thread(new ThreadStart(Register));
     threadFingerRegister.Start();
     threadFingerRegister.IsBackground = true;

    Register 的代码是:

     private void Register()
            {
                Application.Current.Dispatcher.Invoke((Action)delegate ()
                {
                    Application.Current.MainWindow.Close();
                });
            }

    谢谢

    Daisy  Tian


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年10月21日 6:48