应用程序关闭问题

时间:2012-11-11 15:48:13

标签: wpf mvvm prism

在prism应用程序中,我创建了一个以模块开头的登录表单。在用户通过身份验证后,登录表单等待所有应用程序模块已初始化(如splah屏幕显示有关已加载模块的一些信息),然后启动shell。除非用户点击登录表单的取消按钮,否则一切似乎都能正常工作。我想应用程序关闭,但因为登录表单在另一个线程中启动我无法使用Application.Current.Shutdown()(只能工作Enviroment.Exit(0),但我不确定这是一个正确的方法)。我尝试从Application.Current.Dispatcher调用,但应用程序仍然运行。 这是登录模块初始化,我抓住应该关闭应用程序的事件:

public void Initialize()
{        
  Dispatcher.CurrentDispatcher.BeginInvoke(
    (Action) (() =>
        {
            Shell.Show();

            EventAggregator.GetEvent<LoginStatusEvent>().Publish(new LoginStatusEvent { LoginStatus = LoginViewStatus.Close });
        }));      

  ThreadStart showSplash =
    () =>
      {
        Dispatcher.CurrentDispatcher.BeginInvoke(
          (Action) (() =>
                {
                    Container.RegisterType<LoginViewModel, LoginViewModel>();
                    Container.RegisterType<LoginView, LoginView>();

                    var login = Container.Resolve<LoginView>();

                    EventAggregator.GetEvent<LoginStatusEvent>().Subscribe(e => login.Dispatcher.BeginInvoke(
                        (Action)(() =>
                            {
                                if (e.LoginStatus == LoginViewStatus.Aborted)
                                {
                                    login.Close();

                                    Application.Current.Dispatcher.BeginInvoke((Action)(() => Application.Current.Shutdown()));

                                    //Environment.Exit(0);
                                }
                                else if (e.LoginStatus == LoginViewStatus.Close)
                                {
                                    login.Close();                                          
                                }
                                else
                                {
                                    WaitForCreation.Set();
                                }
                            })));

                    login.Show();                            
                }));

        Dispatcher.Run();
      };

  WaitForCreation = new AutoResetEvent(false);

  var thread = new Thread(showSplash) {Name = "LoginView Thread", IsBackground = true};
  thread.SetApartmentState(ApartmentState.STA);
  thread.Start();

  WaitForCreation.WaitOne();
}

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

为什么您的登录UI在后台线程上运行?似乎登录UI应该在GUI线程上运行。然后你有一个BackgroundWorker对象(比上面的代码更容易使用,更易于维护),当ProgressChanged方法回调到GUI线程时,它可以在需要更新UI的任何时候运行ProgressChanged吗?

我经常将BackgroundWorker重载为MyDataObjectBackgroundWorker,并创建一个保存我的对象的属性。通过这种方式,我可以使用ProgressChanged轻松地来回传递数据(就像正在加载模块的信息一样)。