Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从后台线程调用时UI未更新_C#_Wpf_Multithreading_Mvvm_Prism - Fatal编程技术网

C# 从后台线程调用时UI未更新

C# 从后台线程调用时UI未更新,c#,wpf,multithreading,mvvm,prism,C#,Wpf,Multithreading,Mvvm,Prism,我有一个带有标签的启动屏幕,这是在MVVM模式中实现的。我正在更新标签以通知用户该步骤。最初它设置为“加载”,然后当用户单击登录按钮时出现登录屏幕,后台线程被调用来验证此后台线程中的用户。我通过dispatcher更新启动屏幕消息。这工作正常,但在我们得到验证用户的结果之后。我再次将启动屏幕状态更新为“加载模块…”,但它没有更新。下面是我的代码 private void LoginCommandExecute() { Task.Run(() =>

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

 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);
            }
        });
下面用于显示登录窗口和登录视图模型的附件事件

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

          };
LoginControl.LoginViewModel lgVM=new LoginControl.LoginViewModel();
lg=new LoginControl.Login();
lg.DataContext=lgVM;
lgVM.LoginNotification+=(s)=>
{
if(s==Infrastructure.Enums.Status.Success)
{
Task.Run(异步()=>
{
closeLogin=new TaskCompletionSource();
等待closeLogin.Task;
Current.Dispatcher.Invoke(()=>
{
lg.Close();
lgVM.Dispose();
lg=null;
lgVM=null;
},System.Windows.Threading.DispatcherPriority.Background);
});
Task.Run(()=>
{
Current.Dispatcher.Invoke(()=>
{
系统线程线程睡眠(3000);
lg.Hide();
引导程序bs=新引导程序();
bs.CloseSplash+=()=>
{
if(closeLogin!=null)
closeLogin.TrySetResult(null);
sp.Close();
sp=null;
};
b.Run();
});
});
}
else if(s==Infrastructure.Enums.Status.Cancelled)
{
如果(!lg.IsClosing)
lg.Close();
如果(sp!=null)
sp.Close();
}
};
lgVM.SplashController+=(sh,m)=>
{
如果(上海)
{                      
Dispatcher.Invoke(()=>
{
sp.Show();
spVM.Message=m;
},System.Windows.Threading.DispatcherPriority.Send);
DoEvents();
}
其他的
p.Hide();
};

为什么splash controller的调度程序不工作?为什么在UI线程上睡觉?我将移动
System.Threading.Thread.Sleep(3000)当前.Dispatcher.Invoke(()=>{
睡眠
调用
事件
?后退一步,重新评估整个代码库。是的,Haukinger,我将系统.threading.thread.Sleep()放到后台线程及其工作中。谢谢