【问题标题】:Why are Task objects not reusable?为什么任务对象不可重用?
【发布时间】:2013-09-20 04:30:37
【问题描述】:

This question 将我引向另一个更一般(可能是基本)的问题,为什么Task 对象不可重用?

微软不加解释地写下此声明:

一个任务只能启动和运行一次。任何计划的尝试 第二次执行任务将导致异常。

这背后的原因是否如此明显以至于不值得解释?重复设置和启动 Task 并使用 Continuation 不会影响性能吗?

【问题讨论】:

  • Task 表示对传递的委托的单次调用;它是不可重用的,因为它是为了代表一次完成的事情。但是,委托可以随意重复使用多少次,因为它代表要完成的事情,而不是该事情的任何特定执行。
  • 当我们使用Task 来包装Event 时,我们是否会遇到无法理解Task 的一次性使用性质的危险?
  • @rasx,Task 包裹 Event 是什么意思?
  • @rasx 当您使用Task 包装事件时,您是说此任务表示该事件被调用的下一次时间,而不是它表示事件作为一个整体,或每次调用它。要执行后者,您可以使用IObservable,它可以代表该事件的每一次调用。
  • @MattSmith 使用TaskCompletionSource 创建任务的常见模式,该任务将在下次触发事件时完成。

标签: c# task-parallel-library


【解决方案1】:

Task 表示单个可能在未来某个时间发生的事情。它提供了公开指示任务何时完成、是否完成、该任务的最终状态是什么等的方法。

任务完成并再次启动后,IsCompleted 属性应该返回什么?它确实完成了,但您再次启动它。您是说调用者应该只能在启动之后和完成之前的时间窗口内访问最终状态(即是否被取消、是否是异常、它是Result 等)?那会很混乱。

还有其他对象可以表示重复的操作,或一些异步操作的集合,例如(以及其他选项)IObservable,它实际上是一个异步序列,可以(可能)表示对特定委托的 N 次调用的结果,按顺序调用。

【讨论】:

  • 我想我正在了解重用和重构条件之间的区别,以便一次运行一个单一的东西。我也觉得我偶然发现了 ReactiveUI 的理论起源:reactiveui.net ...当我们说某些东西是为了运行 once 时,它的含义可能永远是一次 --- 但是什么它实际上可能是某个特定领域生命周期的时间片内的一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多