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# лямбда-выражение было бы правильным.)