首页 > 解决方案 > 在 UI 中等待任务时遇到问题

问题描述

以下方法在我的 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 组件都需要这个。

根据推荐的指导调整方法允许应用程序运行,但正如预期的那样,在执行 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 的情况下允许它运行?

标签: c#.netwpf

解决方案


上述问题下方的评论摘要


我可以看到发生此错误的唯一原因是ExportToCSV(请记住,它现在正在工作线程中运行,并且工作线程可能无法直接访问 UI)正在访问 UI。是吗?

此外,特别是当您已经处于 UI 回调中时,使用Dispatcher.Invoke*有点毫无意义。async/await

请务必检查相关代码。


推荐阅读