UI中的等待任务

时间:2019-03-08 05:03:46

标签: c# .net wpf

在我的WPF应用程序后面的MainWindow代码中运行的以下方法会产生一个有据可查的StackOverflow错误:

        async void LDAPLookupButton_Click(object sender, RoutedEventArgs e)
        {
            input = LDAPInputFileLocationTextBox_Value.Text;

            LDAPProgress.Visibility = Visibility.Visible;
            await Task.Run(() => LDAPLookups.ExportToCSV(input));
            LDAPProgress.Visibility = Visibility.Hidden;
        }

这将导致错误:

  

调用线程必须是STA,因为许多UI组件都需要STA。

按照建议的指南调整方法可以使应用程序运行,但是按预期,在执行Dispatcher操作期间,UI被阻止:

            async void LDAPLookupButton_Click(object sender, RoutedEventArgs e)
            {
                input = LDAPInputFileLocationTextBox_Value.Text;

                LDAPProgress.Visibility = Visibility.Visible;

                Dispatcher.Invoke(() =>
                {
                     LDAPLookups.ExportToCSV(input);
                });

                LDAPProgress.Visibility = Visibility.Hidden;
            }

我现在有两个问题:

  1. 为什么 LDAPLookups.ExportToCSV 方法不对UI进行更新时会调用“调用线程必须为STA ...”错误?该方法用完了另一个类,仅在本地计算机上创建了一个.csv。

  2. 如何在不阻止UI的情况下允许它运行?

2 个答案:

答案 0 :(得分:2)

上述问题下方的评论摘要


我看到此错误发生的唯一原因是ExportToCSV(请记住它现在正在 worker线程中运行,而worker线程可能无法直接访问UI)正在访问用户界面。是吗?

此外,对于Dispatcher.Invoke*使用async/await毫无意义,尤其是当您已经在UI回调中时。

请务必检查相关代码。

答案 1 :(得分:-1)

第二个问题,使用Dispatcher.BeginInvoke(),该方法将被异步调用。