读取文件异步仍然会阻止UI

时间:2016-11-05 15:31:45

标签: wpf user-interface asynchronous block

我有一个简单的树视图,当点击treeview项目我只是加载一个文本文件

以下是代码:

private async void NotesTreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var clickedModel = e.NewValue as TreeFileItem;
    if (clickedModel != null && File.Exists(clickedModel.FilePath))
    {
        _viewModel.NoteLoadingInProgress = true;
        using (var reader = File.OpenText(clickedModel.FilePath))
        {
            var fileContent = await reader.ReadToEndAsync();
            _viewModel.ActiveNote = fileContent;
        }
        _viewModel.NoteLoadingInProgress = false;
    }
}

这样可行,但是当我点击treeview项时,ui被冻结,直到文件读取完成。为何如此行为?我的代码中有其他异步方法,它们不会阻止ui。

编辑:似乎问题不在于读取文件,而是通过数据绑定将大量文本设置到textbox.text属性,虽然直接设置也需要花费大量时间并使ui冻结

1 个答案:

答案 0 :(得分:2)

  

ui被冻结,直到文件读取完成

使用File.OpenText打开的流永远不会异步。在我describe on my blog时,您必须使用isAsync参数(设置为true)或fileOptions参数(包括FileOptions.Asynchronous值)的方法打开文件)。

  

似乎问题不在于读取文件,而在于通过数据绑定将大量文本设置到textbox.text properti

是的,UI元素不适用于大量数据。如果要显示大量数据,则需要使用virtualization