异步读取文件仍然会阻塞 UI
Reading file async still blocks the UI
我有一个简单的树视图,当点击树视图项目时我只加载一个文本文件
代码如下:
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;
}
}
这有效,但是当我单击树视图项目时,ui 被冻结,直到文件读取完成。为什么会有这样的行为?我的代码中还有其他异步方法,它们不会阻塞 ui.
编辑: 问题似乎不在读取文件中,而是在通过数据绑定将大量文本设置为 textbox.text 属性时,尽管直接设置它也需要一个很多时间,让 ui 冻结
the ui is frozen, until file read is complete
使用 File.OpenText
打开的流从不异步。如我describe on my blog,您必须使用带有isAsync
参数(设置为true
)或fileOptions
参数(包括FileOptions.Asynchronous
值的方法打开文件).
it seems the issue not in reading file, but in setting large amount of text to textbox.text properti via databinding
是的,UI 元素不适用于大量数据。如果要显示大量数据,则需要使用 virtualization。
我有一个简单的树视图,当点击树视图项目时我只加载一个文本文件
代码如下:
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;
}
}
这有效,但是当我单击树视图项目时,ui 被冻结,直到文件读取完成。为什么会有这样的行为?我的代码中还有其他异步方法,它们不会阻塞 ui.
编辑: 问题似乎不在读取文件中,而是在通过数据绑定将大量文本设置为 textbox.text 属性时,尽管直接设置它也需要一个很多时间,让 ui 冻结
the ui is frozen, until file read is complete
使用 File.OpenText
打开的流从不异步。如我describe on my blog,您必须使用带有isAsync
参数(设置为true
)或fileOptions
参数(包括FileOptions.Asynchronous
值的方法打开文件).
it seems the issue not in reading file, but in setting large amount of text to textbox.text properti via databinding
是的,UI 元素不适用于大量数据。如果要显示大量数据,则需要使用 virtualization。