Вызов асинхронной функции в методе void в потоке пользовательского интерфейса (WPF)C#

Место общения программистов C#
Anonymous
Вызов асинхронной функции в методе void в потоке пользовательского интерфейса (WPF)

Сообщение Anonymous »

У меня следующая проблема: мне нужно привязать асинхронный метод к событию Window.Closing. Поскольку событие Closing ожидает CancelEventHandler с сигнатурой void, мой метод WindowClosing не может иметь тип Task. Итак, у меня есть это:

Код: Выделить всё

public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DeinitializeThisFirst();
DeinitializeThisAfterwards();
}
По аппаратным причинам функция DeinitializeThisFirst() должна завершиться до вызова DeinitializeThisAfterwards(). Но DeinitializeThisFirst() — ожидаемая задача. Поскольку я не могу изменить подпись Window_Closing на задачу, я не могу этого сделать:

Код: Выделить всё

public async Task Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
await DeinitializeThisFirst();
DeinitializeThisAfterwards();
}
И поскольку я нахожусь в потоке пользовательского интерфейса, это приведет к тупику:

Код: Выделить всё

public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DeinitializeThisFirst().ConfigureAwait(false).GetAwaiter().GetResult();
DeinitializeThisAfterwards();
}
Выполнение его в отдельной задаче приведет к преждевременному выполнению DeinitializeThisAfterwards():

Код: Выделить всё

public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Task.Run(async () => await DeinitializeThisFirst());
DeinitializeThisAfterwards();
}
И обертывание его в ContinueWith() предотвратит выполнение обоих, поскольку окно немедленно закроется:

Код: Выделить всё

public void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DeinitializeThisFirst().ContinueWith(_ =>
{
DeinitializeThisAfterwards();
});
}
Я здесь в растерянности. Кто-нибудь может помочь?

Подробнее здесь: https://stackoverflow.com/questions/785 ... thread-wpf

Вернуться в «C#»