9

我的 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 会导致取消吗?为什么我的继续没有被调用?

这只是我第二次使用任务库,所以我一无所知。

更新:

我发现了这个 SO 问题:如何将任务的已取消状态传播到继续任务。上面代码中的一个错误(但不是取消的原因)是我假设继续任务的状态与原始任务的状态相同。实际上,正如另一篇文章所述,您必须做一些工作才能从另一个那里得到一个。

更新 2:

布赖恩:感谢您的文档参考。我已经在高处和低处搜索了任务被取消的替代原因,但错过了这些词:

“如果您正在等待转换到已取消状态的任务,则会制造并抛出一个任务(包装在 AggregateException 中)。请注意,此异常表示成功取消而不是错误情况。因此,任务的异常属性返回 null。 "

4

1 回答 1

15

您正在等待继续,并且由于原始任务运行完成,因此取消了继续任务。文档中介绍了此行为。

于 2013-01-28T22:12:12.113 回答