Это продолжение от этого вопроса: Multiple Task ContinuationЗадача Отменено Exception (ThrowForNonSuccess)
Я изменил код, как в ответ, однако теперь я получаю TaskCancelledExceptions
при попытке выполнения задач.
public virtual async Task RunAsync(TaskWithProgress task)
{
Show();
TaskIsRunning();
await SetCompletedHandler(TaskComplete());
await SetCancelledHandler(TaskCancelled())
await SetFaultedHandler(TaskFaulted());
await task;
Close();
}
однако следующий код не является. Я немного зациклен на том, почему.
public virtual Task RunAsync(TaskWithProgress task)
{
Show();
TaskIsRunning();
SetCompletedHandler(TaskComplete());
SetCancelledHandler(TaskCancelled())
SetFaultedHandler(TaskFaulted());
return task;
}
Вызывающий код в основном включает в себя следующее:
await progressDialog.RunAsync(task);
Edit:
Я не отменить cancellationtoken
в любом месте, так что я не могу понять, почему это бросает это исключение.
Методы три SetXXXHandler() в основном выполняет следующий код с различным статусом продолжения:
task.ContinueWith(_ => action(), CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled, this.Scheduler);
Стек след здесь:
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at FugroDXExt.frmBaseProgressAsync.<RunAsync>d__7.MoveNext() in d:\C#\FugroDXExt\trunk\frmBaseProgressAsync.cs:line 92
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at FCP.Forms.frmProcessing.<mnuApplyCenteredSmoothing_ItemClick>d__34.MoveNext() in d:\C#\FCP\FCP\Forms\frmProcessing.cs:line 578
Close()
просто закрывает форму. Если я удалю эту линию, произойдет то же самое.
Скорее всего, какой-то код где-то отменяет 'CancellationToken'. –
Это странная вещь, ее нет. Я отвязал мой «cancelationToken.Cancel()», и он все еще встречается. – Simon
Что такое трассировка стека? И что здесь делает Close()? – Heath