wpf
我有一个主窗口,该窗口在其自己的窗口对话框中打开多个UserControl。每个UserControl都有自己的ViewModel。 这些用户控件又具有多个自定义控件。为了实现高度模块化,我允许自定义控件使用asnyc / await来读写网络服务器。
用户可以通过单击右上方的“ X”关闭每个UserControl。发生这种情况时,程序执行将传递到UserControl的ViewModel中的OnWindowClosingAsync处理程序。
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 que的底部,并允许任何当前正在运行的任务完成,然后再继续关闭UserControl。当然,此代码无效。显然,Task.Yield正在添加其后的代码以异步运行,但是它不会强制其他正在运行的任务在继续之前完成。 (就像保存数据的任务一样。)
那么有没有一种好的通用方法允许所有正在运行的任务(无论它们的上下文如何)在执行Task.Yield之后的代码之前完成?
TIA