以下方法在我的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;
}
我现在有两个问题:
以上问题的评论摘要
我可以看到发生此错误的唯一原因是,如果ExportToCSV
(记住它现在在工作线程中运行而工作线程可能无法直接访问UI)正在访问UI。是吗?
此外,使用Dispatcher.Invoke*
对于async/await
来说有点无意义,特别是当你已经处于UI回调中时。
请务必查看相关代码。
第二个问题使用Dispatcher.BeginInvoke(),它将被异步调用。