首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待使用可使用的方法迭代数据表

等待使用可使用的方法迭代数据表
EN

Stack Overflow用户
提问于 2017-05-26 12:56:24
回答 1查看 694关注 0票数 0

我有以下异步方法,它在每个行babsis上等待单独的方法。在我的一生中,我无法弄清楚如何将其提升到下一个层次,并等待整个datatable成为进程(即让所有行一起开始,而不是一次一行)。任何帮助都将不胜感激。

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 15:49:09

在这种情况下,解决方案就是简单地添加一个函数,然后事情很快就会明朗起来。

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

代码语言:javascript
复制
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

现在,您的主循环如下所示:

代码语言:javascript
复制
For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
  Dim LRPP = Await ProcessRow(row, ...)
  LRPPs.Add(LRPP)
Next

此时,您可以将LRPPs列表更改为

代码语言:javascript
复制
Dim LRPPTasks As New List(Of Task(Of LabResultPanelPack))

并将循环更改为

代码语言:javascript
复制
For Each row As eniCIP_Data.proc_WebPortal_ResultsByPRNRow In dt
  Dim LRPPTask = ProcessRow(row, ...)
  LRPPTasks.Add(LRPPTask)
Next

这样,您就可以避免等待每一行,并在到达await函数中的第一个ProcessRow时继续处理这些行。

你最后要做的就是把你的返回更改为

代码语言:javascript
复制
Return Await Task.WhenAll(LRPPTasks)

你就完蛋了。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44202221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档