首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task.Faulted和Task.Exception

Task.Faulted和Task.Exception
EN

Stack Overflow用户
提问于 2015-08-28 22:15:44
回答 1查看 9.7K关注 0票数 11

TaskStatus EnumTask.Exception MSDN似乎都没有明确声明:

TasksStatus.Faulted总是暗示Task.Exception != null ( TaskStatus != Faulted总是暗示Task.Exception == null)吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-28 22:20:55

是的,Task.IsFaulted的文档明确指出:

如果IsFaulted为true,则任务的状态等于Faulted,并且其Exception属性将为非null。

参考源代码几乎肯定会将其列为。在FinishStageTwo中,我们看到只有在记录了异常的情况下,内部m_state才会设置为faulted:

代码语言:javascript
复制
  if (ExceptionRecorded)
  {
      completionState = TASK_STATE_FAULTED;
      ...
  }
  ...
  Interlocked.Exchange(ref m_stateFlags, m_stateFlags | completionState);

因此,只有在记录了异常的情况下,状态才会出错。

然而,Exception getter确实提到了一个可能的竞争条件:

代码语言:javascript
复制
// 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时,才会发生此争用条件。

因此,如果在任务执行期间调用以下代码,则可能会失败:

代码语言:javascript
复制
 var ex = task.Exception;
 var faulted = task.IsFaulted;
 if (faulted)
     Assert.IsTrue(ex != null);

然而,以下内容永远不会失败:

代码语言:javascript
复制
 var faulted = task.IsFaulted;
 var ex = task.Exception;
 if (faulted)
     Assert.IsTrue(ex != null);

如果您已经完成了任务的等待,那么第一种情况也永远不会失败。这可能就是为什么他们给它贴上“仁慈”的标签,并把它留在里面的原因。受其影响的代码量非常小。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32273165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档