【问题标题】:Passing A Parameter to a Thread using Lambda Expression not working correctly [duplicate]使用 Lambda 表达式将参数传递给线程无法正常工作 [重复]
【发布时间】:2017-08-03 08:23:49
【问题描述】:

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

虽然我只使用一个参数进行测试,但 Lambda 表达式没有正确传递参数的值。 ParameterizedThreadStart 工作正常,但我只能传递一个对象 变量而不能更多,这限制了我。

我为每一个都做了一个例子,而 Lambda 表达式方法输出的输出不正确。

对于这两种情况,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


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

【问题讨论】:

  • 我也在这些线程中找到了答案。如果可能,请关闭问题。谢谢!
  • 问题已关闭。您可以使用帖子底部的“删除”链接自行删除。

标签: c# multithreading lambda parameter-passing


【解决方案1】:

你需要像这样引入局部变量。

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# 中只有 google 闭包

【讨论】:

  • 旁注:如果您不打算做出比许多重复更好的答案,您应该投票关闭...
  • 我还在谷歌上搜索并在网上找到了这篇文章:martyndavis.com/?p=405。它详细解释了它。不过谢谢你的回答。我真的需要知道为什么会这样。
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2017-09-11
相关资源
最近更新 更多