c# - 使用异步任务时,Wpf 读取文件会阻塞 UI 线程
问题描述
嗨,我有一个命令可以读取文件并将它们放入富文本块中,但我遇到了一个问题 - 该命令正在阻塞 UI 线程。
所以代码看起来像:
public ICommand ShowDataCommand => new Command(async log =>
{
var selectedItem = (ProcessedRawEventData)log;
if (selectedItem == null) return;
this.IsDataDisplayVisible = false; //Hides text block
this.IsDataDisplayProgressRingVisible = !this.IsDataDisplayProgressRingVisible; // Show progress ring
this.DataDisplay = await Task.Run(() => File.ReadAllText(selectedItem.LogFile.FullName)); //block
this.IsDataDisplayProgressRingVisible = false; // Hide progress ring
this.IsDataDisplayVisible = !this.IsDataDisplayProgressRingVisible; // Show text box
});
我的 xaml 块很简单:
<StackPanel>
<mah:ProgressRing Width="5" Height="5" HorizontalAlignment="Center" Margin="10,0,0,0"
IsActive="{Binding IsDataDisplayProgressRingVisible}"
Foreground="{DynamicResource AccentBaseColorBrush}" />
<ScrollViewer Margin="10" DockPanel.Dock="Right" Background="#424242" Width="800" MaxHeight="635" VerticalScrollBarVisibility="Auto"
Visibility="{Binding IsDataDisplayVisible, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}" >
<RichTextBox Margin="10">
<FlowDocument>
<Paragraph>
<Run Text="{Binding DataDisplay}"/>
</Paragraph>
</FlowDocument>
</RichTextBox>
</ScrollViewer>
</StackPanel>
我检查了,将读取文件过程替换为:
await Task.Delay(5000);
UI线程不阻塞,我错过了什么?
解决方案
尝试调用 ConfigureAwait(false) 以避免强制在原始上下文(UI 线程)上调用回调:
this.DataDisplay = await Task.Run(() => File.ReadAllText(selectedItem.LogFile.FullName)).ConfigureAwait(false)
推荐阅读
- reactjs - 使用 Hooks 删除表格行
- kubernetes - 通过 Istio 虚拟服务路由到外部站点
- c# - 如何在给出文本框输入之前停止 Windows 窗体程序的执行?
- ios - Google Analytics - Universal Analytics 和 Google Analytics (Firebase) 有什么区别
- r - 如何将矩阵RGB转换为R中的图像
- python - 有什么方法可以将 python 变量传递给 R 代码?
- mysql - 在同一 SQL 语句中使用 IF 和 SET
- excel - 基于标准VBA删除表行
- json - CURL 脚本到 powershell
- javascript - React JS JSX 基于另一个 Toggle 组件显示或隐藏