2

我正在尝试从 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

谢谢

4

2 回答 2

4

您可以通过Lambda 表达式执行此操作:

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 值的闭包,并将其直接传递给您的方法。

于 2011-11-05T00:53:45.570 回答
1

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

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

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

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

于 2011-11-05T00:48:59.597 回答