Выполнение длительных задач без замораживания пользовательского интерфейса
Я пытаюсь выполнить действие в фоновом режиме, не замораживая пользовательский интерфейс.
Конечно, я мог бы использовать BackgroundWorker для этого.
Однако я хотел бы сделать это только с помощью API задач.
Я попробовал:
async void OnTestLoaded(object sender, RoutedEventArgs e)
{
await LongOperation();
}
// It freezes the UI
И
async void OnTestLoaded(object sender, RoutedEventArgs e)
{
var task = Task.Run(()=> LongOperation());
task.Wait();
}
// It freezes the UI
Так должен ли я вернуться к BackgroundWorker? Или есть решение, использующее только задачи?
1 ответ:
Вы были довольно близки.
async void OnTestLoaded(object sender, RoutedEventArgs e) { await Task.Run(() => LongOperation()); }
async
не выполняет метод в пуле потоков thread.
Task.Run
выполняет операцию над потоком пула потоков и возвращаетTask
, представляющий эту операцию.Если вы используете
Task.Wait
в методеasync
, Вы делаете это неправильно. Вы должныawait
задачи вasync
методах, никогда не блокируйте их.