异步设置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
相关产品推荐
相关产品推荐

