2017-08-03 208 views
0

我試圖將多個參數傳遞給線程。使用Lambda表達式將參數傳遞給線程

雖然我只用一個參數進行測試,但Lambda表達式並未正確傳遞參數的值。 ParameterizedThreadStart工作正常,但我可以只傳遞一個對象變量而不是更多,這限制了我。

我已經爲每個做了一個示例,並且Lambda Expression方法輸出的輸出不正確。

對於這兩種情況,numOfPortThreads = 2

使用ParameterizedThreadStart

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); 
      } 
     } 

在 「PortSim.cs」

public void PortRun(object portID) 
     { 

      portStopWatch.Start(); 

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

     } 

在這種情況下的輸出是:

這是端口0
這是端口1


然而,使用Lambda表達式,

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(); 
      } 
     } 

在 「PortSim.cs」

public void PortRun(int portID) 
     { 

      portStopWatch.Start(); 


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

     } 

的在這種情況下的輸出是:

這是端口2
這是端口2


什麼是錯的第二個例子嗎?爲什麼會產生不正確的結果?

+0

我發現這些線程的回答也是如此。如果可能,請關閉該問題。謝謝! –

+0

已經關閉了問題。您可以隨意使用帖子底部的_「刪除」_鏈接自行刪除它。 –

回答

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。它詳細解釋了它。儘管感謝您的回答。我真的需要知道爲什麼會發生這種情況。 –