VB.NET 4.0 Parallel.ForEach AddressOf Несколько значений? - PullRequest
2 голосов
/ 05 ноября 2011

Я пытаюсь перейти от делегатов к 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 ]

4 голосов
/ 05 ноября 2011

Вы можете сделать это с помощью лямбда-выражения :

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 голос
/ 05 ноября 2011

Конечно, в C # я бы использовал лямбда-выражение для вызова Method2 вместо:

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

То, будет ли эквивалент выглядеть элегантно в VB, выходит за рамки здравого смысла, который у меня есть относительно языка, который я не использую в 12.50, но на самом деле у вас нет другого выбора - при условии, что вы этого не делаете хотите создать экземпляр другого класса, передав path в конструктор, а затем используя метод с одним параметром в этом классе ...

(Да, и другим вариантом было бы изменить Method2 на метод с одним параметром, в котором параметр инкапсулировал оба значения. Так что, я думаю, у вас do есть несколько опций - но по крайней мере в C #, лямбда-выражение - один из способов.)

...