2017-08-03 4 views
0

スレッドに複数のパラメータを渡そうとしています。ラムダ式を使用してスレッドにパラメータを渡す式が正しく動作しない

私は1つのパラメータでテストしていますが、ラムダ式はパラメータの値を正しく渡していません。 ParameterizedThreadStartは正常に動作していますが、は1つのオブジェクトを渡すことしかできません。

私はそれぞれの例を作成しましたが、Lambda Expressionメソッド出力の出力は正しくありません。両方の場合について

、numOfPortThreads = 2

その場合に出力されるParameterizedThreadStart "PortSim.cs"

public void PortRun(object portID) 
     { 

      portStopWatch.Start(); 

      Console.WriteLine("This is Port {0}", portID); 
      Console.ReadKey(); 

     } 

public void InitializePorts(int numOfPortThreads) 
     { 
      Thread[] tPortArr = new Thread[numOfPortThreads]; 

      for (int i = 0; i < numOfPortThreads; i++) 
      { 

       tPortArr[i] = new Thread(new ParameterizedThreadStart(new PortSim().PortRun)); 
       tPortArr[i].Start(i); 
      } 
     } 

使用:

これは、これは、ラムダ式を使用して、しかし


ポート1である "PortSim.cs"

public void PortRun(int portID) 
     { 

      portStopWatch.Start(); 


      Console.WriteLine("This is Port {0}", portID); 
      Console.ReadKey(); 

     } 

public void InitializePorts(int numOfPortThreads) 
     { 
      Thread[] tPortArr = new Thread[numOfPortThreads]; 

      for (int i = 0; i < numOfPortThreads; i++) 
      { 

       tPortArr[i] = new Thread(() => new PortSim().PortRun(i)); 
       tPortArr[i].Start(); 
      } 
     } 

ポート0
ですその場合の出力は次のとおりです。

これは
ポート2である。これは、第二の例と間違っている何ポート2


のですか?なぜそれは不正確な結果をもたらすのですか?

+0

にクロージャをグーグル、私は同様にこれらのスレッドで答えを見つけることがなぜあなたは不思議に思われるかもしれません。可能であれば質問を閉じてください。ありがとう! –

+0

質問は既に終了しました。あなたは、あなたの投稿の一番下にある_ "delete" _リンクを使って、自分で削除することができます。 –

答えて

0

このようなローカル変数を導入する必要があります。

public void InitializePorts(int numOfPortThreads) 
     { 
      Thread[] tPortArr = new Thread[numOfPortThreads]; 

      for (int i = 0; i < numOfPortThreads; i++) 
      { 
       int j = i; 
       tPortArr[j] = new Thread(() => new PortSim().PortRun(j)); 
       tPortArr[j].Start(); 
      } 
     } 

ちょうどC#

+1

サイドノート:多くの複製よりも優れた回答をするつもりでない場合は、代わりに投票に投票するだけです... –

+0

私はまだグーグルでグーグルで、この記事をオンラインで見つけました:https://www.martyndavis.com/?p = 405。詳細に説明しました。あなたの答えをありがとう。なぜこれが起こっているのかを知る必要がありました。 –

関連する問題