У меня есть приложение Windows Forms и форма со множеством обработчиков событий async void. Данная форма может быть закрыта пользователем в любой момент. После закрытия формы я хочу удалить временный файл, и моя проблема в том, что этот файл все еще может использоваться каким-либо обработчиком событий async void моей формы, что приводит к исключению IOException. Код, удаляющий файл, размещается сразу после вызова Application.Run(form) внутри метода Main. Мой вопрос: как я могу заставить метод Application.Run продолжать блокировать поток выполнения Main, пока все обработчики событий async void моей формы не будут завершены?
Вот минимальная демонстрация желаемого поведения:
Код: Выделить всё
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
int completedOperations = 0;
Form form = new();
form.Load += async (s, e) =>
{
await Task.Delay(1000);
completedOperations++;
};
form.Shown += async (s, e) =>
{
await Task.Delay(2000);
completedOperations++;
};
Application.Run(form);
MessageBox.Show($"Completed operations: {completedOperations}");
}
Желаемый результат:
Обе операции async void всегда должны завершаться, когда поток выполнения достигает последней строки MessageBox.Show. Фактический (нежелательный) вывод приведенного выше кода зависит от того, насколько быстро пользователь закроет окно. Если она закроет его менее чем за две секунды, может быть выполнено только 0 или 1 операция.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... d-handlers