Вот минимальная демонстрация желаемого поведения:
Код: Выделить всё
[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}");
}
Код: Выделить всё
Completed operations: 2
Уточнения: Настройка Task.Delay(1000) с помощью .ConfigureAwait(false) невозможна. Мои фактические обработчики событий взаимодействуют с компонентами пользовательского интерфейса, поэтому обязательно возобновить работу потока пользовательского интерфейса после ожидания. Код под Application.Run(form) также должен выполняться в потоке пользовательского интерфейса. Я не хочу использовать многопоточность в своем приложении.
Изменить: Я ищу «правильный» способ решения этой проблемы. Я не ищу грязного обходного пути. Вероятно, я мог бы решить мою конкретную проблему с IOException, выполнив цикл занятости после Application.Run:
Код: Выделить всё
while (true) { try { File.Delete(path); break; } catch { } Application.DoEvents(); }
Подробнее здесь: https://stackoverflow.com/questions/798 ... d-handlers
Мобильная версия