У меня есть какая-то длительная фоновая задача расчета
private async void StartButton_onClick(object sender, RoutedEventArgs e)
{
cts = new CancellationTokenSource();
var task = Task.Run(() => Calculate(cts.Token));
tasks.Add(task);
await task;
tasks.Remove(task);
cts = null;
}
Эта задача может быть отменена, когда пользователь нажимает кнопку Cancel
, и должна автоматически отменяться, когда пользователь вызывает какую-либо другую деятельность, скажем, нажимает Change
кнопка, чтобы открыть диалоговое окно для изменения параметров расчета.
Чтобы избежать записи кода отмены дважды для двух операций, я переместил его в отдельный метод
public async void CancelAsync()
{
if (cts != null && !cts.IsCancellationRequested)
{
cts.Cancel();
await Task.WhenAll(tasks);
}
}
и вызвал его изсобытие нажатия кнопки
private async void CancelButton_onClick(object sender, RoutedEventArgs e)
{
await Task.Run(() => CancelAsync());
}
private async void ChangeButton_onClick(object sender, RoutedEventArgs e)
{
await Task.Run(() => CancelAsync());
OpenDialog();
}
Проблема в том, что метод OpenDialog()
вызывается до того, как CancelAsync()
запускается в соревнование.
В чем я тут не прав?пожалуйста