Vb.net VB正在等待asyc调用,该调用也在等待调用

Vb.net VB正在等待asyc调用,该调用也在等待调用,vb.net,asynchronous,async-await,Vb.net,Asynchronous,Async Await,我是VB新手,不太熟悉异步函数。 我需要修复现有代码中的一个bug,其中一些代码在数据加载完成之前构建报告 问题是在调用loadOption1(数据)之前调用了BuildReport()。我需要应用程序在运行之前等待所有LoadAsync()完成,但当它等待GetData()时,应用程序返回start()并过早运行BuildReport() 代码大致如下所示: Public Async Sub start() await LoadAsync() BuildReport() '

我是VB新手,不太熟悉异步函数。 我需要修复现有代码中的一个bug,其中一些代码在数据加载完成之前构建报告

问题是在调用loadOption1(数据)之前调用了BuildReport()。我需要应用程序在运行之前等待所有LoadAsync()完成,但当它等待GetData()时,应用程序返回start()并过早运行BuildReport()

代码大致如下所示:

Public Async Sub start()

    await LoadAsync()

    BuildReport() ' this must not run until everything in Load is complete

End Sub

Public Async Function LoadAsync() As System.Threading.Tasks.Task        
'this is called from other locations, not just from Start()

    dim data = await GetData() 'call to database
    ' at this point start() continues to run
    ' but we need it to keep waiting for these next calls to complete

    'these calls are synchronous, builds objects needed for the report 
    loadOption1(data)
    loadOption2(data)
    loadOption3(data)

    'now we want to return to start()
End Function


Public Async Function GetData(s As Scenario) As Task(Of DataResults)

    ...

    Dim resp = Await Task.Run(Function() ConfigWebService.FetchIncentives(req)) ' soap call

End Function
(每个功能在同一项目内的不同类中)

我已尝试从启动功能中删除等待;调用BuildReport()后加载选项

如果我从GetData()调用中删除wait,将data.result传递给loadoptions函数,整个应用程序就会永远挂起

我被难住了。任何提示都将不胜感激

编辑:更新样本以正确反映实际代码

更新: 我已经尝试了我能想到的一切,从.ContinueWith(False),到附加到父任务,再到使用.ContinueWith(),但到目前为止都没有成功。
一旦代码到达LoadAsync()中的wait,Start()中的任务就被视为完成了

唯一有效的方法是在LoadAsync()开始时将isLoading标志设置为true,然后在LoadOptions3()完成后将其设置为false。然后检查标志值是否在具有延迟的循环中发生了更改

Public Async Sub start()

    await LoadAsync()

    For i As Integer = 1 To 50
        If Not IsLoading Then Exit For
        Await System.Threading.Tasks.Task.Delay(100)
    Next

    BuildReport() 

End Sub

该错误是否与异步/等待相关?您试图解决什么问题?传递
数据.Result
的问题可能是您正在从UI线程执行此操作,并且当您尝试此操作时,阻塞
任务的结果会导致死锁。同时包含
wait
的版本通常看起来是正确的<代码>构建报告
加载
完成之前不应运行。我能看到的唯一潜在问题是
Load
的类型不正确,因为声明的类型是
Object
,但它应该是
Task
Load()
函数是否与
start()
在同一个类中?另外,在
GetData()
函数中是否触发了任何异步调用?最后,旁注。。。最佳实践是在异步方法名称后面加上async这个词
LoadAsync()
,和
GetDataAsync()
。如果“在不同的线程上使用数据。结果”,请小心,当您不一定期望它时,您仍然可以在UI线程上结束。我建议您阅读Stephen Cleary关于
Async
wait
的大部分工作。这篇文章是一个很好的切入点:(我还推荐他写的最后链接的MSDN文章。)