在UI中等待任务的麻烦

问题描述 投票:2回答:2

以下方法在我的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# .net wpf
2个回答
2
投票

以上问题的评论摘要


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

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

请务必查看相关代码。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.