У меня есть форма, в которой я запускаю задачу для загрузки содержимого. Если пользователь нажимает «Отменить», эту задачу, конечно, необходимо отменить. Но, кажется, я делаю что-то не так. Форма никогда не закрывается и продолжает ждать задачи:
public partial class Designer : Form
{
private CancellationTokenSource _cancellationTokenSource;
private Task _loadTask;
private async void Designer_Shown(object sender, EventArgs e)
{
_cancellationTokenSource = new CancellationTokenSource();
try
{
_loadTask= Workbench.Instance.CurrentPackage.LoadObjects(_cancellationTokenSource.Token);
await _loadTask;
}
catch (Exception ex)
{
Debug.Print(ex.ToString());
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
_cancellationTokenSource.Cancel();
_loadTask.Wait(); //Waits forever
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
Где моя вина?
Изменить код LoadObjects()
public Task LoadObjects(CancellationToken cancelToken)
{
return Task.Run(() =>
{
LoadParameters(cancelToken);
LoadConditionChecks(cancelToken);
LoadConditonRules(cancelToken);
LoadOperations(cancelToken);
}, cancelToken);
}
Я передаю токен подметодам, так как циклы действительно существуют...
Workbench.Instance.CurrentPackage.LoadObjects
. Вы уверены, что он соблюдает токен отмены? - person Gusdor   schedule 04.08.2017CancellationToken
, должна быть проверка на отмену, напримерCancellationToken.IsCancellationRequested
илиCancellationToken.ThrowIfCancellationRequested
. Если ее нет, просто в самом конце вы получите такое поведение. - person Peter Bons   schedule 04.08.2017LoadObjects()
- person Marco Rebsamen   schedule 04.08.2017