使用Lambda表达式将参数传递给线程无法正常工作

时间:2017-08-03 00:09:00

标签: c# multithreading lambda parameter-passing

我正在尝试将多个参数传递给线程。

我只测试一个参数,而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

第二个例子有什么问题?为什么会产生不正确的结果?

1 个答案:

答案 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#