You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步设置Window.Closing事件Cancel标志的相关技术疑问

WPF窗口Closing事件异步处理的疑问

我为Window.Closing事件实现了如下异步事件处理器:

private async void View_Closing(object sender, CancelEventArgs e) {
    await OnClosingAsync(e);
}
private async Task OnClosing(CancelEventArgs e) {
    foreach (BaseConfigEditViewModel viewModel in ConfigEditViewModels) {
        if (!await viewModel.IsReadyToCloseAsync()) {
            e.Cancel = true;
            return;
        }
    }

    List<BaseConfigEditViewModel> tmpViewModels = new(ConfigEditViewModels);
    foreach (BaseConfigEditViewModel viewModel in tmpViewModels) {
        viewModel.Close();
    }
}
public async Task<bool> IsReadyToCloseAsync() {
    if (await GetHasChangedAsync()) {
        switch (MessageBox.Show($"{Header} has changed. Save changes?", "Info", MessageBoxButton.YesNoCancel, MessageBoxImage.Question)) {
            case MessageBoxResult.Yes:
                await SaveAsync();
                return true;
            case MessageBoxResult.Cancel:
                return false;
            case MessageBoxResult.No:
                return true;
        }
    }

    return true;
}

Cancel标志会在异步方法中设置,且我在事件处理器里等待该方法执行完成。但事件处理器本身是async void类型,属于“即发即弃”的调用机制,我有个疑问:窗口是如何知道要等待所有订阅者处理完成的?毕竟它必须等处理完成后才能知道是否有订阅者设置了Cancel标志,不是吗?

补充说明:调用链已覆盖多个类,直至执行数据库调用的异步方法。

内容的提问来源于stack exchange,提问作者ThomasW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:40:09