wpf
У меня есть главное окно, которое открывает несколько пользовательских элементов управления в их собственных диалоговых окнах. Каждый элемент UserControls имеет свою собственную ViewModel.
Эти пользовательские элементы управления в свою очередь имеют несколько пользовательских элементов управления. Чтобы быть очень модульным, я позволяю настраиваемым элементам управления использовать asnyc / await для чтения / записи на сетевой сервер.
Каждый пользовательский элемент управления может быть закрыт пользователем, нажав на правую верхнюю букву «Х». Когда это происходит, выполнение программы передается обработчику OnWindowClosingAsync в ViewModel UserControl.
public async Task OnWindowClosingAsync(object s, CancelEventArgs e)
{
WindowDialog w = (WindowDialog)s;
if (OkToClose)
{
e.Cancel = false; // e.Cancel = false allows closing the window.
return;
}
OkToClose = false;
// Cancel window closure until all running tasks have completed..
e.Cancel = true; // e.Cancel = true keeps window open.
w.IsEnabled = false; // Consider w.Hide(). Stop further user interaction with this window. (Window is dimmed).
....more code ...
await Task.Yield(); <--**FAILS TO WAIT FOR OTHER TASKS TO COMPLETE.
OkToClose = true;
WritingLayer.Dispose();
// Manually closing the windowdialog will force reentry into OnWindowClosingAsync(), (i.e., this procedure).
w.Close();
}
Идея, на которую я надеялся, заключалась в том, что Task.Yield поместит код OnWindowClosingAsync (), следующий за Task.Yield, в конец очереди Task и позволит завершить любую текущую задачу, прежде чем перейти к закрытию UserControl. Этот код не работает, конечно. Очевидно, что Task.Yield добавляет код, который следует за ним, для асинхронного запуска, но он не заставляет другие запущенные задачи завершаться до его продолжения. (Как задачи, которые сохраняют данные).
Так есть ли хороший общий способ, позволяющий завершить все выполняющиеся задачи (независимо от их контекста) перед выполнением кода, следующего за Task.Yield?
1012 * ТИА *