使用Lambda表达式将参数传递给线程
我试图将多个参数传递给线程。使用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
什么是错的第二个例子吗?为什么会产生不正确的结果?
您需要引入像这样的局部变量。
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#
备注:如果你不打算比许多重复的答案更好,你应该投票结束,而不是... –
我还在谷歌搜索,并在网上找到这篇文章:https://www.martyndavis.com/?p = 405。它详细解释了它。尽管感谢您的回答。我真的需要知道为什么会发生这种情况。 –
我发现这些线程的回答也是如此。如果可能,请关闭该问题。谢谢! –
已经关闭了问题。您可以随意使用帖子底部的_“删除”_链接自行删除它。 –