Выполнение длительных задач без замораживания пользовательского интерфейса
Я пытаюсь выполнить действие в фоновом режиме, не замораживая пользовательский интерфейс.
Конечно, я мог бы использовать 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методах, никогда не блокируйте их.