在我的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;
}
我现在有两个问题:
为什么 LDAPLookups.ExportToCSV 方法不对UI进行更新时会调用“调用线程必须为STA ...”错误?该方法用完了另一个类,仅在本地计算机上创建了一个.csv。
如何在不阻止UI的情况下允许它运行?
答案 0 :(得分:2)
上述问题下方的评论摘要
我看到此错误发生的唯一原因是ExportToCSV
(请记住它现在正在 worker线程中运行,而worker线程可能无法直接访问UI)正在访问用户界面。是吗?
此外,对于Dispatcher.Invoke*
使用async/await
毫无意义,尤其是当您已经在UI回调中时。
请务必检查相关代码。
答案 1 :(得分:-1)
第二个问题,使用Dispatcher.BeginInvoke(),该方法将被异步调用。