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

问题描述

wpf

我有一个主窗口,它在他们自己的窗口对话框中打开几个用户控件。每个用户控件都有自己的 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 将在 Task.Yield 之后将 OnWindowClosingAsync() 代码放在 Task que 的底部,并允许任何当前正在运行的任务在继续关闭 UserControl 之前完成。此代码当然不起作用。显然,Task.Yield 正在添加它后面的代码以异步运行,但它不会强制其他正在运行的任务在继续之前完成。(比如保存数据的任务)。

那么,在执行 Task.Yield 之后的代码之前,是否有一种很好的通用方法可以让所有正在运行的任务(无论其上下文如何)完成?

TIA

标签: c#wpfasync-await

解决方案


推荐阅读