我的C#任务正在取消,但不是我。我没有得到堆栈跟踪,我无法弄清问题发生的位置。
我的任务调用如下所示:
var t = Task<Boolean>.Factory.StartNew(() =>
{
Boolean bOk = DoSomthingImportant();
return bOk;
}, TaskCreationOptions.AttachedToParent)
.ContinueWith<Boolean>((theTask) =>
{
var reason = theTask.IsCanceled ? "it was canceled" : "it faulted";
Debug.WriteLine("Error: Task ended because " + reason + ".");
... log the exception to one of my objects...
return false;
}, TaskContinuationOptions.NotOnRanToCompletion);
如果任务出现故障或被取消,我希望继续运行任务,但如果运行正常则不行。 永远不会执行继续。
稍后我的程序会捕获一个包含TaskCanceledException的AggregateException。
我与我的任务的另一个主要交互是调用WaitAny(taskArray,timeout)直到我没有更多的任务要启动,然后在上一个任务完成之前调用WaitAll而没有超时。
WaitAny有超时会导致取消吗?为什么我的延续不被召唤?
这只是我第二次刷任务库,所以我一无所知。
更新:
我发现了这个问题:如何将任务的已取消状态传播到继续任务。 我上面的代码中的一个错误(但不是取消的原因)是我假设Continuation任务状态与原始任务的状态相同。事实上,你需要做一些工作来从另一个中获取一个,正如另一篇文章所描述的那样。
更新2:
布莱恩:谢谢你的文件参考。我已经搜索了一个任务被取消的替代原因的高低搜索,但是错过了这些词:“如果您正在等待转换到已取消状态的任务, 生成并抛出一个Task(包含在AggregateException中)。 请注意,此异常表示成功取消而不是 一个错误的情况。因此,Task的Exception属性返回 空“。