c# - 如何在 WPF 关闭事件中使用 DerralManager GetDeferral()?
问题描述
WPF
我正在尝试延迟关闭窗口,直到使用 StephenCleary https://github.com/StephenCleary/AsyncEx的 async/await 库完成所有任务。
事件处理程序委托和事件参数定义:
public delegate void CancelEventHandlerAsync(object sender, CancelEventArgsAsync e);
public class CancelEventArgsAsync : CancelEventArgs
{
private readonly DeferralManager _deferrals = new DeferralManager();
public IDisposable GetDeferral()
{
return this._deferrals.GetDeferral();
}
public Task WaitForDefferalsAsync()
{
return this._deferrals.SignalAndWaitAsync();
}
}
然后在 NewWindowDialog.xaml 后面的代码中,我重写了 OnClosing 事件:
public NewWindowDialog()
{
InitializeComponent();
}
protected override async void OnClosing(System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
base.OnClosing(e);
await LaunchAsync();
}
private async Task LaunchAsync()
{
var vm =(NewProgressNoteViewModel)DataContext;
var cancelEventArgs = new CancelEventArgsAsync();
using (var deferral = cancelEventArgs.GetDeferral())
{
// a very long procedure!
await vm.WritingLayer.CompletionAsync();
}
}
显然,这失败了,因为 e.Cancel = true 在等待之前执行。那么,在任务完成时(在 WPF 中)正确使用 GetDeferral() 来延迟窗口关闭,我缺少什么。
TIA
编辑:在大家的帮助下,我目前正在使用它。但是,有没有人有关于关闭窗口的延迟模式的一个很好的例子?
谢谢大家。
private bool _handleClose = true;
protected override async void OnClosing(System.ComponentModel.CancelEventArgs e)
{
using (new BusyCursor())
{
if (_handleClose)
{
_handleClose = false;
IsEnabled = false;
e.Cancel = true;
var vm = (NewProgressNoteViewModel)DataContext;
await vm.WritingLayer.SaveAsync();
e.Cancel = false;
base.OnClosing(e);
}
}
}
解决方案
你不需要延期。只需将CancelEventArgs.Cancel
属性设置为true
,等待长时间运行的操作,然后关闭。您可以使用标志来避免多次执行相同的操作:
private bool _handleClose = true;
protected override async void OnClosing(System.ComponentModel.CancelEventArgs e)
{
if (_handleClose)
{
e.Cancel = true;
await Task.Delay(5000);// a very long procedure!
_handleClose = false;
Close();
}
}
推荐阅读
- ruby - For 循环在 Ruby irb 中不能使用 string.length
- mysql -
插入前删除未完成 - javascript - 迭代表行中的数据
- python - 尝试将模型从 Tensorflow 1.15.3 迁移到 Keras 和 Tensorflow 2.3.0
- sql - 如何让我的 SQL 查询删除最近的记录?
- javascript - 使用 `function` 编写类过去更快。那么为什么我们现在使用`class`呢?
- python - 特征提取:0%| | 0/25000 [00:00
import cv2 import numpy as np import os from random import shuffle from tqdm import tqdm TRAIN_DIR =
- docker - Cloud Build Docker 未构建
- sparc - Sparc 处理器中的奇偶寄存器配对是什么?
- networking - 连接到同一无线网络的 PC 被分配了不同子网的 IP。如何为它们分配一个子网中的 IP?