Выполнение длительных задач без замораживания пользовательского интерфейса


Я пытаюсь выполнить действие в фоновом режиме, не замораживая пользовательский интерфейс.

Конечно, я мог бы использовать 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 7

1 ответ:

Вы были довольно близки.

async void OnTestLoaded(object sender, RoutedEventArgs e)
{
  await Task.Run(() => LongOperation());
}

async не выполняет метод в пуле потоков thread.

Task.Run выполняет операцию над потоком пула потоков и возвращает Task, представляющий эту операцию.

Если вы используете Task.Wait в методе async, Вы делаете это неправильно. Вы должны await задачи в async методах, никогда не блокируйте их.