首页 > 解决方案 > 执行后台任务时 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();
}

标签: c#wpfseleniumselenium-webdriverselenium-chromedriver

解决方案


您在这里有两个选择。要么制作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);

推荐阅读