谁取消了我的任务是什么?(Who canceled my Task?)

2019-08-08 14:50发布

我的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,超时),直到我有没有更多的任务开始,然后WaitAll调用,没有超时,直到最后的任务就完成了。

可以用一个超时了WaitAny会取消? 为什么没有我的延续被调用?

这只是我第二次刷任务库,让我无言以对。

更新:

我发现这太问题:如何将一个任务的取消状态传播到后续任务。 在我上面的代码(但不是对消的原因)的一个错误是,我假定延续任务的状态是一样的原始任务的状态。 事实上,你必须做一些工作,以获得从其他的人,因为其他职位描述。

更新2:

布莱恩:谢谢你的文件建立参考。 我已经搜查高和低任务的备用原因被取消,但错过了这些话:

“如果你对过渡到取消状态的任务等待着,一个任务(包装在一个AggregateException)制造和抛出。请注意,此异常指示成功消除,而不是一个错误的情况。因此,任务的Exception属性返回null。 “

Answer 1:

你在等待的延续和由于原任务趋向完成后续任务被取消。 这种行为是覆盖在文档 。



文章来源: Who canceled my Task?