c# - 执行后台任务时 WPF UI 阻塞(硒自动化)
问题描述
我的 WPF 应用程序中有一个按钮,其功能如下
private void Button_Click(object sender, RoutedEventArgs e)
{
loadingSpinner.Visibility = Visibility.Visible;
DoSomeTask(); // Takes 3-4 seconds
}
我的问题是下面的代码
loadingSpinner.Visibility = Visibility.Visible;
在执行完成后DoSomeTask()
执行,并且所有与 UI 相关的代码都被阻止,这些代码都写在它上面。我尝试了后台工作人员、Parallel.Invoke 和异步任务,但没有任何效果。这看起来只是几分钟的工作,但已经过去了一天多,我无法通过它。
编辑
如果我尝试像这样等待
private async void Button_Click(object sender, RoutedEventArgs e)
{
loadingSpinner.Visibility = Visibility.Visible;
await Task.Run(() => DoSomeTask()); // Takes 3-4 seconds
}
loadingSpinner 变得可见,但 DoSomeTask() 中的代码永远不会执行(打开网页并执行一些操作)
private void DoSomeTask()
{
//... init variables
driver.Navigate().GoToUrl("https://myurl.com");
//.. some clicks and data filling
driver.FindElement(By.Id("name")).SendKeys("Test");
driver.FindElement(By.Id("btn")).Click();
}
解决方案
您在这里有两个选择。要么制作DoSomeTask()
anasync Task
并等待它,要么将其包装成 a Task.Run()
:
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
spinner.Visibility = Visibility.Visible;
await DoSomeTask();
spinner.Visibility = Visibility.Hidden;
}
private async Task DoSomeTask() => await Task.Delay(5000);
或者:
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
spinner.Visibility = Visibility.Visible;
await Task.Run(DoSomeTask);
spinner.Visibility = Visibility.Hidden;
}
private void DoSomeTask() => Thread.Sleep(5000);
推荐阅读
- python - 如何在使用moviepy使用django保存时为视频文件添加水印
- javascript - 传单时间维度更改时间范围
- git - 如何绕过 SourceTree 询问密钥密码?
- python - 如何使用 python 从 Telethon GetContactsRequest 访问嵌套列表中的特定项目
- javascript - 为什么我的 globalState 状态对象在我自己更新之前被更新?
- javascript - 在树莓派上运行对象检测 (@tensorflow/tfjs-node") - ELFCLASS64
- reactjs - 不能在带有 Unform 的 React-select 上使用 Options 道具
- azure-web-app-service - Azure 进程资源管理器未报告所有内存
- iis - 错误:无法使用 msdeploy tempagent 获取远程环境变量“WindowsDirectory”
- python - 为什么最后一个陈述是错误的?(edx)