VB.NET 4.0 Parallel.ForEach AddressOf多值?

时间:2011-11-05 00:46:54

标签: vb.net .net-4.0 parallel-extensions

我正在尝试从Delegates更改为Parallel.ForEach

我看到下面的工作正常。

Imports System.Threading.Tasks

  Sub Main()
   Dim secs() As Integer = {2, 3, 1}
   Parallel.ForEach(secs, AddressOf Method2)
  End Sub

  Sub Method2(ByVal i As Integer)
   Console.WriteLine(i.ToString)
  End Sub

但是如果我的Sub需要多个变量呢?你能告诉我我应该怎么做吗?

Imports System.Threading.Tasks
  Sub Main()
   Dim secs() As Integer = {2, 3, 1}
   Dim Path as String = "Constant"

   Parallel.ForEach(secs, Path, AddressOf Method2)
  End Sub

 Sub Method2(ByVal i As Integer, path as string )
  Console.WriteLine(i.ToString, path)
 End Sub

谢谢

2 个答案:

答案 0 :(得分:4)

您可以通过Lambda Expression

执行此操作
Imports System.Threading.Tasks
  Sub Main()
   Dim secs() As Integer = {2, 3, 1}
   Dim Path as String = "Constant"

   Parallel.ForEach(secs, Sub(sec) Method2(sec, Path))
  End Sub

 Sub Method2(ByVal i As Integer, path as string)
  Console.WriteLine(i.ToString(), path)
 End Sub

这将允许编译器创建一个获取Path值的闭包,并将其直接传递给您的方法。

答案 1 :(得分:1)

当然在C#中,我会使用lambda表达式来调用Method2

Parallel.ForEach(secs, i => Method2(i, path));

VB中的等效内容是否优雅,超出了我对上午12点50分没有使用的语言的良好判断力,但你没有其他很多选择 - 假设你没有想要创建另一个类的实例,将path传递给构造函数,然后在该类中使用单参数方法......

(哦,另一种选择是将Method2更改为单个参数方法,其中参数封装了两个值。所以我猜你有几个选项 - 但在C#中至少,lambda表达式将成为可行的方法。)