Vb.net 等待使用等待的方法迭代数据表
我有下面的异步方法,它在每行babsis上等待单独的方法。在我的一生中,我无法理解如何将其提升到下一个级别,并等待整个数据表被处理(即,让所有行一起开始,而不是一次一行)。任何帮助都将不胜感激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
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,谢谢你付出了这么多的努力,真是太棒了!尼特拉姆,谢谢你付出这么多的努力,真是太棒了!