【发布时间】:2014-01-17 16:11:21
【问题描述】:
这是这个问题的延续: Multiple Task Continuation
我已经按照答案更改了我的代码,但是现在我在尝试运行任务时收到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);
编辑:
我不会在任何地方取消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。 -
这很奇怪,它不是。我解开了我的
cancellationToken.Cancel(),它仍然会发生。 -
什么是堆栈跟踪?那么 Close() 是什么意思呢?
-
究竟是哪一行引发了异常?
-
'await prog.RunAsync' 调用
标签: c# .net asynchronous task-parallel-library async-await