vb.net中后台处理的建议

vb.net中后台处理的建议,vb.net,multithreading,Vb.net,Multithreading,在我最近接手的一个项目中,有一个对函数的调用,该函数进行一些计算;这是连续调用的,多次调用(通常在1到10次之间) 为了加快速度,我尝试添加异步处理(参见上面的示例),这在我的代码中起作用,所有任务都是同时完成的,但我不明白的是如何等待所有这些线程完成(没有设置的线程数量,它可以在1到10之间,具体取决于其他一些数据)在完成所有任务后需要运行的最终任务之前 有人能建议一种方法吗?我正在寻找一种简单的方法,基本上说“好的,所有任务都完成了,请调用另一个任务” 悬崖 需要同时运行多个任务(介于1和

在我最近接手的一个项目中,有一个对函数的调用,该函数进行一些计算;这是连续调用的,多次调用(通常在1到10次之间)

为了加快速度,我尝试添加异步处理(参见上面的示例),这在我的代码中起作用,所有任务都是同时完成的,但我不明白的是如何等待所有这些线程完成(没有设置的线程数量,它可以在1到10之间,具体取决于其他一些数据)在完成所有任务后需要运行的最终任务之前

有人能建议一种方法吗?我正在寻找一种简单的方法,基本上说“好的,所有任务都完成了,请调用另一个任务”

悬崖

  • 需要同时运行多个任务(介于1和10之间)
  • 每个任务需要几秒钟
  • 代码目前可以工作——它可以同时完成所有任务
  • 完成所有任务(1-10之间)后 完成后,触发一些其他代码(仅当所有任务都完成时)-使用最佳方法执行以下操作

    • 最简单的方法是将所有新线程放入一个列表中,然后迭代该列表并调用每个线程。join方法将阻止当前线程,直到要加入的线程完成:

      如果以下代码中存在任何语法错误,我深表歉意-我手边没有VB,而且我对语法的记忆也非常生疏:

      Dim threadList as New List(Of Thread)
      While dr.read  ‘depending on a db call, loop 1 or more times
       Dim calc As New CalcClass
       Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff))
       newDoStuff.Start(calc)
       threadList.Add(newDoStuff)
      End while
      For Each t as Thread in ThreadList
          t.Join
      End For
      

      话虽如此,我强烈建议您考虑使用中的类,因为这提供了一个比启动和管理自己的线程更好的范例。

      将所有线程都放在一个列表中

      Dim threads As new List(Of System.Threading.Thread)
      
      While dr.read  ‘depending on a db call, loop 1 or more times
          Dim calc As New CalcClass
          Dim newDoStuff As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf DoStuff))
          threads.Add(newDoStuff)
          newDoStuff.Start(calc) 
      End while
      
      最后加入所有的线程

      For Each thread In threads Do
          thread.Join()
      Next
      

      如果可以的话,我会修改它以使用Parrel任务库。等待其他线程的方法称为
      Join
      。在这里阅读:我不知道有什么方法可以不使用回调就等待线程完成。我建议不要为每个任务启动一个线程,也许可以将它们组合成多个任务,并报告每个组的状态。@asawyer-尽管你的建议是正确的。TPL还没有准备好进入黄金时段。据我所知,它将包含在.NETFramework 4.5中。他不需要使用TPL来使用Thread.Join方法。你必须小心线程。加入你很容易导致你自己的死锁。@Ramhound对不起,我实际上是指pLinq,不知道我是怎么把它们搞混的!
      For Each thread In threads Do
          thread.Join()
      Next