后台工作人员冻结了我的GUI
本文关键字:我的 GUI 结了 冻结 工作人员 后台 | 更新日期: 2023-09-27 18:03:02
我有一个验证用户的WPF应用程序。当该用户成功通过身份验证时,界面将更改并向该用户表示hello。我希望,欢迎消息出现在5秒,然后改变它与另一个内容。这是我启动BackgroundWorker
的欢迎消息:
LabelInsertCard.Content = Cultures.Resources.ATMRegisterOK + " " + user.Name;
ImageResult.Visibility = Visibility.Visible;
ImageResult.SetResourceReference(Image.SourceProperty, "Ok");
BackgroundWorker userRegisterOk = new BackgroundWorker
{
WorkerSupportsCancellation = true,
WorkerReportsProgress = true
};
userRegisterOk.DoWork += userRegisterOk_DoWork;
userRegisterOk.RunWorkerAsync();
这是延迟5秒的BackgroundWorker
:
void userRegisterOk_DoWork(object sender, DoWorkEventArgs e)
{
if (SynchronizationContext.Current != uiCurrent)
{
uiCurrent.Post(delegate { userRegisterOk_DoWork(sender, e); }, null);
}
else
{
Thread.Sleep(5000);
ImageResult.Visibility = Visibility.Hidden;
RotatoryCube.Visibility = Visibility.Visible;
LabelInsertCard.Content = Cultures.Resources.InsertCard;
}
}
但是后台工作人员冻结了我的GUI 5秒钟。显然,我想做的是在Welcome消息发出5秒后在worker中启动代码。
为什么会冻结GUI?
你明显违背了后台worker的目的。
你的代码切换回回调中的UI线程,并在那里做所有的事情。
也许这就是你想要的:
void userRegisterOk_DoWork(object sender, DoWorkEventArgs e)
{
if (SynchronizationContext.Current != uiCurrent)
{
// Wait here - on the background thread
Thread.Sleep(5000);
uiCurrent.Post(delegate { userRegisterOk_DoWork(sender, e); }, null);
}
else
{
// This part is on the GUI thread!!
ImageResult.Visibility = Visibility.Hidden;
RotatoryCube.Visibility = Visibility.Visible;
LabelInsertCard.Content = Cultures.Resources.InsertCard;
}
}