【问题标题】:Async CTP and timeouts异步 CTP 和超时
【发布时间】:2011-08-19 01:54:00
【问题描述】:

我开始看Jon Skeet's presentation on C# Async CTP。他在指定超时时结结巴巴。

由于对 F# 的了解相当有限,因此有一种直观、集中且简单的方法来指定超时。所以,我想知道目前的情况是什么:C# Async CTP 可以做 F# async block runner 做的所有事情吗?是否有概述差异和限制的文件?


其他细节: 在 F# 中,异步块运行器提供了一种指定以下内容的方法:

  1. 异常流程
  2. 超时流程
  3. 取消流程
  4. 上述三个功能的可扩展性

这是在 F# 中执行这些操作的一种方法: Order of arguments and pipe-right operator

【问题讨论】:

  • 请注意,F# 中的异步工作流也会暴露尾调用(return! 到另一个工作流),这非常重要。 C# 有这个吗?
  • @Jon Harrop:我只知道 C# 没有尾调用优化。我不相信 5.0 会发生变化。
  • @Jon Harrop:在观看了以下讨论 (channel9.msdn.com/Shows/Going+Deep/…) 之后,我离开的印象是您可以在链中编写异步调用。但是在这里和乔恩交谈之后,我不太确定。可能值得一个单独的 Q。
  • 他们实际上在 C# CTP 中有一个完整的蹦床实现,可以用来模拟尾调用,因此他们可能会或确实在调用一个异步时使用它来实现尾调用消除从另一个。但是,我不确定他们是否会这样做,即使他们这样做,蹦床的速度也是出了名的慢。

标签: c# .net f# timeout async-ctp


【解决方案1】:

我什至不记得提到过超时 - 但我会相信你的话 :)

组合任务来实现超时是相当容易的:创建第二个“延迟”任务,然后等待该任务或原始任务完成。无论哪个先到达,如果可行,取消另一个(使用取消令牌)。新创建的任务将完成主操作的结果(如果成功),或者如果“延迟”首先完成,则会出现异常。

我没有看到在 AsyncCtpLibrary.dll 中直接支持的任何东西,但是您可以使用 提供的工具相当容易地构建它。您可能需要查看“Task-Based Asynchronous Pattern Overview”和“TPL Dataflow”文档,看看它们是否也涵盖了它。

【讨论】:

  • 感谢您的快速回复。因此,您有一个“调用”链中的十几个异步方法的配方。这意味着我必须做些什么,究竟是什么?
  • @GregC:这十二个是平行的还是串联的?如果它们是并行的,您可以使用 WhenAll 将这 12 个任务有效地转换为 1,然后使用答案中的建议。如果它们是串联的,异步方法将返回一个代表整个操作的任务 - 然后您可以对其应用相同的建议。
  • @Jon Skeet:在 F# 示例中,您可以控制 AsyncBuilder monadic 块中列出的操作是在外部并行运行还是串行运行。值得深思。
  • @GregC:在 C# 异步中,这通常可以从简单的流程中清楚地看出 - 如果您创建两个任务然后等待它们,它将是并行的。如果您创建一个并等待它,然后创建另一个然后等待它,它们将是串联的。我怀疑这里的关键区别在于基于任务的异步模式中的任务是,而F#异步中的IIRC是。这肯定会改变事物的表达方式,如果您对一种方式非常满意,然后再看到另一种方式,则可能会令人困惑:)
  • @Jon Skeet:这是关键的区别。感谢您帮助我更好地理解该主题。
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2011-12-10
  • 1970-01-01
  • 2011-09-20
  • 2011-10-20
相关资源
最近更新 更多