小编Smo*_*ian的帖子

取消任务关闭窗口。如何检测任务是否同步返回?

我遵循一种相当常见的模式,使用异步对话框方法确认/取消主窗口关闭。但是,在我调用来呈现对话框的异步任务中,在某些情况下我会立即返回布尔值,而不是等待对话框任务方法的返回。在这些情况下会抛出异常:

System.InvalidOperationException:“在窗口关闭时无法将可见性设置为可见或调用 Show、ShowDialog、Close 或 WindowInteropHelper.EnsureHandle。”

看来这因为异步任务同步返回并在窗口上调用 Close(),而不是调用其余代码作为延续。除了在 try/catch 中包装 Close() 或在返回 bool 之前在函数中添加 Task.Delay() 之外,还有其他方法可以检测是否应该在窗口上调用 Close() 吗?(即,如果任务同步返回)

或者...我在概念上遗漏了异步/等待模式中的某些内容吗?

这是我的代码:

private bool _closeConfirmed;

private async void MainWindow_OnClosing(object sender, CancelEventArgs e)
{
    //check if flag set
    if(!_closeConfirmed)
    {
        //use flag and always cancel first closing event (in order to allow making OnClosing work as as an async function)
        e.Cancel = true;

        var cancelClose = await mainViewModel.ShouldCancelClose();

        if(!cancelClose)
        {
            _closeConfirmed = true;
            this.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

异步函数如下所示:

public async Task<bool> ShouldCancelClose() …
Run Code Online (Sandbox Code Playgroud)

c# wpf async-await

2
推荐指数
1
解决办法
1492
查看次数

标签 统计

async-await ×1

c# ×1

wpf ×1