2017-05-26 75 views
0

我有以下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 

回答

2

在这种情况下的解决方案是简单地添加一个功能,并迅速清理的东西。

如果您创建处理的一个一行像这样的处理的新功能:

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。这样你的开销就会少一点。

+0

Nitram,感谢您付出如此多的努力,作品享受! – user3280560