在递归的异步方法中强制同步行为

时间:2017-06-08 20:02:33

标签: vb.net recursion async-await

我对async / await模式相对较新,但我试图加快速度,因为我使用的是仅暴露异步方法的第三方API。我需要编写一个递归方法来遍历目录结构。例如,假设结构如下所示:

/(root)
    Folder1/
        Folder3/
        Folder4/
    Folder2/
        Folder5/
            Folder6

我最初的抓取版本是"完全"异步版本,它看起来像这样:

Async Function GetFolderContents(thisPath) As Task(Of Blah())
    Dim result as Blah()
    thisFolderContents = await _thirdPartyAsyncMethod.GetContents(thisPath)
    For Each singleFolder In thisFolderContents
         result.Add(singleFolder)
         result.AddRange(await GetFolderContents(singleFolder))
    Next
    Return result
End Function

每当我尝试调用此方法时,我都无法获得Folder2或其子项的任何结果 - 我只能让它返回Folder1及其子项。基于我对async / await的脆弱知识,我有点理解为什么会这样(尽管我已经完全准备承认我可能做错了)。

我可以通过从方法定义中删除Async并使用第三方异步方法的.Result来使其按预期方式工作:

thisFolderContents = _thirdPartyAsyncMethod.GetContents(thisPath).Result

即使这似乎有用,我的问题是,应该我这样做吗?我收集这些方法是异步的原因,这种方法有效地使同步。在调用您没有编写的异步方法时是否有更合适的方法来实现递归,或者这是使用.Result是唯一的方法的边缘情况之一?

0 个答案:

没有答案