C# 在UI中等待任务时遇到问题

C# 在UI中等待任务时遇到问题,c#,.net,wpf,C#,.net,Wpf,以下方法在我的WPF应用程序中的主窗口代码中运行,产生了一个记录良好的StackOverflow错误: async void LDAPLookupButton_Click(object sender, RoutedEventArgs e) { input = LDAPInputFileLocationTextBox_Value.Text; LDAPProgress.Visibility = Visibility.V

以下方法在我的WPF应用程序中的主窗口代码中运行,产生了一个记录良好的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;
            }
在这一点上,我有两个问题:

  • 为什么在LDAPLookups.ExportToCSV方法未更新UI时调用“调用线程必须是STA…”错误?该方法没有其他类,只在本地计算机上创建一个.csv

  • 在不阻塞UI的情况下,如何允许运行此功能


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

    上述问题下的注释摘要



    出现此错误的唯一原因是
    ExportToCSV
    (请记住,它现在在工作线程中运行,工作线程可能无法直接访问UI)正在访问UI。是吗

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


    确保检查相关代码。

    这确实使其异步,但我需要等待该方法完成。如果我在Dispatcher.BeginInvoke之前添加了一个wait,我将返回到阻止UI。如果为true,则OP正在使用
    async/wait
    ,并且已经在UI线程上。问题出在工作线程中我能看到发生此错误的唯一原因是
    ExportToCSV
    (请记住它现在正在工作线程中运行)正在访问UI。它是?使用
    Dispatcher.Invoke*
    对于
    async/await
    来说是毫无意义的,尤其是当您已经在UI callbackAh中时。我在LDAPLookups类(staticmainwindowmain=newmainwindow();)中找到了一行,我在其中创建了一个MainWindow实例。我删除了它,不再遇到错误。奇怪的是,仅仅创建一个MainWindow实例,而不操纵任何属性或控件就足以生成该错误。好的,我已经发布了我的评论作为答案