等待用等待方法来检查数据表
问题描述:
我有以下Async方法,它等待每行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
而在这一点上你可以将您的LRPPs
列表更改为
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
函数中的第一个await
达到继续。
所有你需要在最后要做的就是改变你的回归
Return Await Task.WhenAll(LRPPTasks)
和你完成。
就像一个小小的增加:在我按照我的建议重新编写代码之后,最终只会得到Function
中的Await
。这意味着您可以从功能中删除Async
标志,并从Return
中删除Await
。这样你的开销就会少一点。
Nitram,感谢您付出如此多的努力,作品享受! – user3280560