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