C# 在UI中等待任务时遇到问题
以下方法在我的WPF应用程序中的主窗口代码中运行,产生了一个记录良好的StackOverflow错误: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
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;
}
在这一点上,我有两个问题:
对于第二个问题,请使用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实例,而不操纵任何属性或控件就足以生成该错误。好的,我已经发布了我的评论作为答案