Завершение Task после закрытия Wpf Window

Рейтинг: 1Ответов: 1Опубликовано: 11.03.2023

Всем здравствуйте, пытаюсь решить задачу с завершением асинхронной операции после нажатия на кнопку крестик у window

Уже попробовал кучу разных вариантов, так и не могу решить простую проблему, подскажите пожалуйста...

   protected async override void OnClosing(CancelEventArgs e)
    {
        ///Есть параллельная задача у приложения которая крутится её нужно завершить
        CancellationTokenSources.Cancel();
        await _appTask;
        base.OnClosing(e);
        /// Дальше окно просто закрывается и процесс завершается.
        // по логике в моей голове это должно работать так, но из-за async void всё 
        ///работает совершенно не так, а вот как эту проблему решить не понимаю(
    }

Ответы

▲ 0Принят

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

Чтобы отложить закрытие окна, можно отменить закрытие, выполнить свои работы, затем выполнить закрытие ещё раз.

Допустим этот код находится в самом окне.

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);
}

Можно ещё задизаблить окно, вывести на него сообщение типа "Завершение работы...", чтобы юзер в случае длительного ожидания с ума не сошёл.