Vb.net 等待使用等待的方法迭代数据表

Vb.net 等待使用等待的方法迭代数据表,vb.net,asynchronous,datatable,async-await,datarow,Vb.net,Asynchronous,Datatable,Async Await,Datarow,我有下面的异步方法,它在每行babsis上等待单独的方法。在我的一生中,我无法理解如何将其提升到下一个级别,并等待整个数据表被处理(即,让所有行一起开始,而不是一次一行)。任何帮助都将不胜感激 Public Async Function GetLabResultPanelPackByPRN_Async(ByVal ClientID As Integer, ByVal PRN As Integer, ByVal SamplePointID As Integer, ByVal StartDa

我有下面的异步方法,它在每行babsis上等待单独的方法。在我的一生中,我无法理解如何将其提升到下一个级别,并等待整个数据表被处理(即,让所有行一起开始,而不是一次一行)。任何帮助都将不胜感激

    Public Async Function GetLabResultPanelPackByPRN_Async(ByVal ClientID As Integer, ByVal PRN As Integer, ByVal SamplePointID As Integer, ByVal StartDate As DateTime, ByVal EndDate As DateTime, ByVal InequalityMode As InequalityModes) As Task(Of List(Of LabResultPanelPack))
    Dim LRPPs As New List(Of LabResultPanelPack)
    Dim ta As New eniCIP_DataTableAdapters.proc_WebPortal_ResultsByPRNTableAdapter
    Dim dt As New eniCIP_Data.proc_WebPortal_ResultsByPRNDataTable
    ta.Fill(dt, PRN)
    For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
        Dim LRPP As New LabResultPanelPack
        LRPP.LabResult = GetLabResultByPRNFromRow(row, InequalityMode)

        Dim ResultsByDetAndSPTask As Task(Of List(Of LabResultExtended)) = GetResultsByDetAndSP_Async(ClientID, SamplePointID, row.lDetID, StartDate, EndDate, InequalityMode)
        Dim ResultsBySampleTypeAndDetTask As Task(Of List(Of LabResultExtended)) = GetResultsBySampleTypeAndDet_Async(ClientID, row.lSampleTypeID, row.lDetID, StartDate, EndDate, InequalityMode)
        Dim ResultsBySampleTypeGroupAndDetTask As Task(Of List(Of LabResultExtended)) = GetResultsBySampleTypeGroupAndDet_Async(ClientID, row.lSampleTypeGroupID, row.lDetID, StartDate, EndDate, InequalityMode)

        LRPP.HistoricResultsByDetAndSP = Await ResultsByDetAndSPTask
        LRPP.HistoricResultsByDetAndSampleType = Await ResultsBySampleTypeAndDetTask
        LRPP.HistoricResultsByDetAndSampleTypeGroup = Await ResultsBySampleTypeGroupAndDetTask

        LRPPs.Add(LRPP)
    Next

    Return LRPPs
End Function

这种情况下的解决方案是简单地添加一个函数,然后事情很快就解决了

如果创建一个新函数来处理一行的处理,如下所示:

Private Async Function ProcessRow(row As YourRowType, ...) As Task(Of LabResultPanelPack)
  Dim LRPP As New LabResultPanelPack
  LRPP.LabResult = GetLabResultByPRNFromRow(row, InequalityMode)

  'Add your tasks for processing the row further
  Return LRPP
End Function
现在,您的主循环如下所示:

For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
  Dim LRPP = Await ProcessRow(row, ...)
  LRPPs.Add(LRPP)
Next
此时,您可以将
lrps
列表更改为

Dim LRPPTasks As New List(Of Task(Of LabResultPanelPack))
并将循环更改为

For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
  Dim LRPPTask = ProcessRow(row, ...)
  LRPPTasks.Add(LRPPTask)
Next
这样可以避免等待每一行,并在到达
ProcessRow
函数中的第一个
wait
时继续处理行

最后你需要做的就是改变你的回报率

Return Await Task.WhenAll(LRPPTasks)
你的任务完成了


作为一个小小的补充:按照我的建议重写代码后,您将在
函数中得到唯一的
wait
。这意味着您可以从函数中删除
Async
标志,并从
Return
中删除
wait
。这样可以减少一些开销。

这种情况下的解决方案就是简单地添加一个函数,然后事情很快就解决了

如果创建一个新函数来处理一行的处理,如下所示:

Private Async Function ProcessRow(row As YourRowType, ...) As Task(Of LabResultPanelPack)
  Dim LRPP As New LabResultPanelPack
  LRPP.LabResult = GetLabResultByPRNFromRow(row, InequalityMode)

  'Add your tasks for processing the row further
  Return LRPP
End Function
现在,您的主循环如下所示:

For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
  Dim LRPP = Await ProcessRow(row, ...)
  LRPPs.Add(LRPP)
Next
此时,您可以将
lrps
列表更改为

Dim LRPPTasks As New List(Of Task(Of LabResultPanelPack))
并将循环更改为

For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
  Dim LRPPTask = ProcessRow(row, ...)
  LRPPTasks.Add(LRPPTask)
Next
这样可以避免等待每一行,并在到达
ProcessRow
函数中的第一个
wait
时继续处理行

最后你需要做的就是改变你的回报率

Return Await Task.WhenAll(LRPPTasks)
你的任务完成了


作为一个小小的补充:按照我的建议重写代码后,您将在
函数中得到唯一的
wait
。这意味着您可以从函数中删除
Async
标志,并从
Return
中删除
wait
。这样你的开销就少了一点。

Nitram,谢谢你付出了这么多的努力,真是太棒了!尼特拉姆,谢谢你付出这么多的努力,真是太棒了!