Вот мой код. Обработчик событий для кнопки WPF, которая читает строки файла:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
Button.Content = "Loading...";
var lines = await File.ReadAllLinesAsync(@"D:\temp.txt"); //Why blocking UI Thread???
Button.Content = "Show"; //Reset Button text
}
Я использовал асинхронную версию метода File.ReadAllLines()
в приложении .NET Core 3.1 WPF.
Но он блокирует поток пользовательского интерфейса! Почему?
Обновление: так же, как @Theodor Zoulias, я провожу тест:
private async void Button_OnClick(object sender, RoutedEventArgs e)
{
Button.Content = "Loading...";
TextBox.Text = "";
var stopwatch = Stopwatch.StartNew();
var task = File.ReadAllLinesAsync(@"D:\temp.txt"); //Problem
var duration1 = stopwatch.ElapsedMilliseconds;
var isCompleted = task.IsCompleted;
stopwatch.Restart();
var lines = await task;
var duration2 = stopwatch.ElapsedMilliseconds;
Debug.WriteLine($"Create: {duration1:#,0} msec, Task.IsCompleted: {isCompleted}");
Debug.WriteLine($"Await: {duration2:#,0} msec, Lines: {lines.Length:#,0}");
Button.Content = "Show";
}
результат:
Create: 652 msec msec, Task.IsCompleted: False | Await: 15 msec, Lines: 480,001
.NET Core 3.1, C # 8, WPF, отладочная сборка | 7,32 Мбайт Файл (.txt) | Жесткий диск 5400 SATA
ReadAllLines
. Он использует асинхронную версию, и она все еще зависает (что должно быть невозможно, поэтому я предполагаю, что что-то еще вызывает проблемы) - person Andy   schedule 02.08.2020var lines = await Task.Run(() => File.ReadAllLines(@"D:\temp.txt"));
, как предложено в ответе, это не только поддерживает отзывчивость пользовательского интерфейса, но и в 7 раз быстрее, чемReadAllLinesAsync
! - person aepot   schedule 03.08.2020