VB.NET 4.0 Parallel.ForEach AddressOf Несколько значений?

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

Решение

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

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, и передать его непосредственно в ваш метод.

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

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

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

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

Другие вопросы по тегам