【问题标题】:Asynchronous recursion in .NET.NET 中的异步递归
【发布时间】:2012-10-10 22:13:29
【问题描述】:

我这里有一些简化的代码

Async Function GetCoolNumber() As Task(Of Double)
    Dim n = Await GetNumberFromSomeAsyncSource()
    If IsCool(n) Then
        Return n
    End If
    Return Await GetCoolNumber()
End Function

Private Function GetNumberFromSomeAsyncSource() As Task(Of Double)

Private Function IsCool(n As Object) As Boolean

现在递归工作正常,我得到了我想要的结果。当然,我的真实代码更复杂。然而,这被认为是不好的做法吗?

如果我以这种方式进行无限递归会怎样?有什么东西会吹吗?我的直觉是我会继续将任务转储到堆上而不是耗尽我的堆栈。

【问题讨论】:

    标签: vb.net asynchronous recursion async-await ctp


    【解决方案1】:

    我倾向于避免 .NET 中的正常递归;对尾调用优化的支持存在一些差异,所以我只是作为一般规则避开。

    使用async,由于重写,您可能没问题;您可以使用 dotPeek / JustDecompile 确定。

    IMO 最好避免依赖未记录的功能。所以,如果重写是正式记录的(例如,VB.NET 语言标准),那么我会说它很好。否则,我会迭代地编写它。

    【讨论】:

    • 我试过 JustDecompile 但它太聪明了。它显示了我写的确切代码,包括 ASYNC / AWAIT 关键字:(
    • 我没用过JustDecompile。旧的 Reflector 有一个“多么聪明”的选项——例如,你可以将它设置为旧版本,它会假装不理解新的语言语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2013-07-11
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多