UI从后台线程调用时不更新

时间:2016-12-30 12:04:33

标签: c# wpf multithreading mvvm prism

我有一个带有标签的闪屏,这是用MVVM模式实现的。我正在更新标签以通知用户该步骤。最初它设置为“正在加载”然后登录屏幕出现当用户点击登录按钮并调用后台线程来验证用户从这个后台线程我通过调度程序更新启动画面消息这工作正常但是我们得到验证用户的结果。我再次将启动屏幕状态更新为“正在加载模块..”,但它没有更新。以下是我的代码。

 private void LoginCommandExecute()
    {
        Task.Run(() =>
        {
            SplashController.Invoke(true, "Authenticating...");
            var result= AuthenticateUser();
            if (result)
            {
                SplashController.Invoke(true, "Loading Modules....");
                LoginNotification.Invoke(Infrastructure.Enums.Status.Success);
            }
        });

下面用于向登录视图模型显示登录窗口和attache事件。

 LoginControl.LoginViewModel lgVM = new LoginControl.LoginViewModel();
        lg = new LoginControl.Login();
        lg.DataContext = lgVM;
        lgVM.LoginNotification += (s) =>
          {
              if (s == Infrastructure.Enums.Status.Success)
              {

                      Task.Run(async () =>
                      {
                          closeLogin = new TaskCompletionSource<object>();
                          await closeLogin.Task;
                          Current.Dispatcher.Invoke(() =>
                          {
                              lg.Close();
                              lgVM.Dispose();
                              lg = null;
                              lgVM = null;
                          }, System.Windows.Threading.DispatcherPriority.Background);
                      });



                  Task.Run(() =>
                 {
                      Current.Dispatcher.Invoke(() =>
                     {
                         System.Threading.Thread.Sleep(3000);
                         lg.Hide();
                         BootStrapper bs = new BootStrapper();
                         bs.CloseSplash += () =>
                         {
                             if (closeLogin != null)
                                 closeLogin.TrySetResult(null);
                             sp.Close();
                             sp = null;
                         };
                         bs.Run();

                     });
                 });


              }
              else if(s==Infrastructure.Enums.Status.Canceled)
              {
                  if (!lg.IsClosing)
                      lg.Close();
                  if(sp!=null)
                      sp.Close();
              }
          };
        lgVM.SplashController += (sh, m) =>
          {
              if (sh)
              {                      
                  Dispatcher.Invoke(() =>
                  {
                      sp.Show();
                      spVM.Message = m;                          
                  },System.Windows.Threading.DispatcherPriority.Send);
                  DoEvents();

              }
              else
                  sp.Hide();                      

          };

0 个答案:

没有答案