我正在尝试将多个参数传递给线程。
我只测试一个参数,而Lambda Expression没有正确传递参数的值。 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 Expression,
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 这是Port 2
第二个例子有什么问题?为什么会产生不正确的结果?
答案 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#