Завершение Task после закрытия Wpf Window
Всем здравствуйте, пытаюсь решить задачу с завершением асинхронной операции после нажатия на кнопку крестик у window
Уже попробовал кучу разных вариантов, так и не могу решить простую проблему, подскажите пожалуйста...
protected async override void OnClosing(CancelEventArgs e)
{
///Есть параллельная задача у приложения которая крутится её нужно завершить
CancellationTokenSources.Cancel();
await _appTask;
base.OnClosing(e);
/// Дальше окно просто закрывается и процесс завершается.
// по логике в моей голове это должно работать так, но из-за async void всё
///работает совершенно не так, а вот как эту проблему решить не понимаю(
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Данный обработчик не предназначен для асинхронной работы. Вы не можете просто так взять приостановить завершение в асинхронном режиме.
Чтобы отложить закрытие окна, можно отменить закрытие, выполнить свои работы, затем выполнить закрытие ещё раз.
Допустим этот код находится в самом окне.
private bool isShutdown;
protected override async void OnClosing(CancelEventArgs e)
{
if (!isShutdown)
{
e.Cancel = true;
base.OnClosing(e);
if (!CancellationTokenSources.IsCancellaionRequested)
{
try
{
CancellationTokenSources.Cancel();
await _appTask;
isShutdown = true;
this.Close(); // повторный вызов закрытия
}
catch (Exception ex)
{
Debug.Fail(ex.ToString());
}
}
}
else
base.OnClosing(e);
}
Можно ещё задизаблить окно, вывести на него сообщение типа "Завершение работы...", чтобы юзер в случае длительного ожидания с ума не сошёл.