TaskStatus Enum和Task.Exception MSDN似乎都没有明确声明:
TasksStatus.Faulted总是暗示Task.Exception != null ( TaskStatus != Faulted总是暗示Task.Exception == null)吗?
发布于 2015-08-28 22:20:55
是的,Task.IsFaulted的文档明确指出:
如果IsFaulted为true,则任务的状态等于Faulted,并且其Exception属性将为非null。
参考源代码几乎肯定会将其列为。在FinishStageTwo中,我们看到只有在记录了异常的情况下,内部m_state才会设置为faulted:
if (ExceptionRecorded)
{
completionState = TASK_STATE_FAULTED;
...
}
...
Interlocked.Exchange(ref m_stateFlags, m_stateFlags | completionState);因此,只有在记录了异常的情况下,状态才会出错。
然而,Exception getter确实提到了一个可能的竞争条件:
// Only return an exception in faulted state (skip manufactured exceptions)
// A "benevolent" race condition makes it possible to return null when IsFaulted is
// true (i.e., if IsFaulted is set just after the check to IsFaulted above).仅当Exception getter正在运行时IsFaulted变为true时,才会发生此争用条件。
因此,如果在任务执行期间调用以下代码,则可能会失败:
var ex = task.Exception;
var faulted = task.IsFaulted;
if (faulted)
Assert.IsTrue(ex != null);然而,以下内容永远不会失败:
var faulted = task.IsFaulted;
var ex = task.Exception;
if (faulted)
Assert.IsTrue(ex != null);如果您已经完成了任务的等待,那么第一种情况也永远不会失败。这可能就是为什么他们给它贴上“仁慈”的标签,并把它留在里面的原因。受其影响的代码量非常小。
https://stackoverflow.com/questions/32273165
复制相似问题