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

ラムダ式を介してこれを行うことができます:

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#では、代わりにラムダ式を使用して呼び出しMethod2ます。

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

同等のものがVBでエレガントに見えるかどうかは、午前12時50分に使用しない言語について私が持っている適切な判断の量を超えていますが、作成したくないと仮定すると、他の選択肢はあまりありません。別のクラスのインスタンス。コンストラクターに渡さpathれ、そのクラスで単一パラメーターのメソッドを使用します。

(ああ、もう1つのオプションはMethod2、パラメーターが両方の値をカプセル化する単一のパラメーターメソッドに変更することです。したがって、いくつかのオプションがあると思います、少なくともC#では、ラムダ式の1つが最適です。)

于 2011-11-05T00:48:59.597 に答える