Wpf
Я пытаюсь отложить закрытие окна, пока все задачи не будут выполнены с помощью
библиотека асинхронных / ожидающих файлов StephenCleary https://github.com/StephenCleary/AsyncEx.
Определения делегата обработчика события и аргументов события:
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 выполняется перед ожиданием. Так что я упускаю, чтобы правильно использовать GetDeferral (), чтобы задержать закрытие окна во время выполнения задач (в WPF).
ТИА
Редактировать: с помощью всех, я в настоящее время использую это. Однако есть ли у кого-нибудь хороший пример паттерна отсрочки при закрытии окна?
Спасибо всем.
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);
}
}
}