2017-08-03 204 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。它详细解释了它。尽管感谢您的回答。我真的需要知道为什么会发生这种情况。 –