允许所有正在运行的任务在完成当前异步方法(wpf)之前完成的通用方法?

时间:2018-11-06 19:43:40

标签: c# wpf async-await

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

0 个答案:

没有答案