首页 > 解决方案 > 使用异步任务时,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线程不阻塞,我错过了什么?

标签: c#wpf

解决方案


尝试调用 ConfigureAwait(false) 以避免强制在原始上下文(UI 线程)上调用回调:

this.DataDisplay = await Task.Run(() => File.ReadAllText(selectedItem.LogFile.FullName)).ConfigureAwait(false)

推荐阅读