c# - 在 UI 中等待任务时遇到问题
问题描述
以下方法在我的 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;
}
在这一点上我有两个问题:
为什么在LDAPLookups.ExportToCSV方法未对 UI 进行更新时调用“调用线程必须是 STA...”错误?该方法用尽了另一个类,只是在本地机器上创建了一个 .csv。
如何在不阻塞 UI 的情况下允许它运行?
解决方案
上述问题下方的评论摘要
我可以看到发生此错误的唯一原因是ExportToCSV
(请记住,它现在正在工作线程中运行,并且工作线程可能无法直接访问 UI)正在访问 UI。是吗?
此外,特别是当您已经处于 UI 回调中时,使用Dispatcher.Invoke*
有点毫无意义。async/await
请务必检查相关代码。
推荐阅读
- feathersjs - Feathers auth 登录无效
- c - 通过 HTTP 请求将文件上传到 Google Drive (C)
- php - 为什么成功交易后paypal沙箱金额没有变化?
- database-migration - Camunda 为数据库创建脚本使用单独的用户
- php - 按类别对数据库中的数据进行分组
- java - 如何为包的所有类中的所有方法替换 catch 块中的现有代码?
- scala - 如何在 Scala 中的类型擦除泛型接口上表达类型边界?
- c# - 控制事件在 DataContext 更新后多次工作
- azure - Azure 门户狐狸必应广告沙盒 api
- kotlin - 无法解析 androidx 上的参考 Recyclerview.adapter