Сделайте ваш обработчик кликов асинхронным и установите TaskCompletionSource в делегате.
Чтобы сделать это, вы должны определить делегата как Func<Task<int>>
, поскольку все ожидаемые методы должны возвращать Task<>
некоторого вида.
private async Task ShowLoading(Func<Task<int>> func)
{
await func.Invoke();
this.Close();
}
private async void Button1_Click_1(object sender, EventArgs e)
{
await ShowLoading( () =>
{
var source = new TaskCompletionSource<int>();
Server server = new Server(new ServerConnection(".\\sqlexpress", "sa", "underadmin"));
Backup backup = new Backup() { Action = BackupActionType.Database, Database = "TestMedia" };
backup.Devices.AddDevice(@"D:\BACKUP\TestMedia.bak", DeviceType.File);
backup.Initialize = true;
backup.PercentComplete += Backup_PercentComplete;
backup.Complete += (s,e) => { source.SetResult(0); };
backup.SqlBackupAsync(server);
return source.Task;
});
}
Но гораздо более простой способ сделать это - просто обработать событие Complete
с помощью действия close.
private void Button1_Click_1(object sender, EventArgs e)
{
Server server = new Server(new ServerConnection(".\\sqlexpress", "sa", "underadmin"));
Backup backup = new Backup() { Action = BackupActionType.Database, Database = "TestMedia" };
backup.Devices.AddDevice(@"D:\BACKUP\TestMedia.bak", DeviceType.File);
backup.Initialize = true;
backup.PercentComplete += Backup_PercentComplete;
backup.Complete += (o,e) => { this.Close(); };
backup.SqlBackupAsync(server);
}