【问题标题】:Create new threads in a for loop and pass parameters在 for 循环中创建新线程并传递参数
【发布时间】:2015-08-20 20:17:09
【问题描述】:

考虑这段代码:

for(int i = 0; i < 10; i ++)
{
    new Thread(() => Test(i)).Start();
}

Test(int i) 函数:

public void Test(int i)
{
    Console.WriteLine("=== Test " + i);
}

实际输出:

=== 测试 3
=== 测试 4
=== 测试 4
=== 测试 5
=== 测试 5
=== 测试 5
=== 测试 9
=== 测试 9
=== 测试 9
=== 测试 10

如您所见,有些数字丢失了,有些数字重复了。

预期输出:

我希望以随机顺序查看所有数字。

问题

我应该锁定任何变量/方法吗?我该如何解决这个问题?

【问题讨论】:

    标签: c# multithreading parallel-processing


    【解决方案1】:

    我应该锁定任何变量/方法吗?我该如何解决这个问题?

    你的问题在于 ClosureCaptured Variables

    将代码更改为

    for(int i = 0; i < 10; i ++)
    {
        int tmp = i;
        new Thread(() => Test(tmp)).Start();
    }
    

    欲了解更多信息:http://csharpindepth.com/articles/chapter5/closures.aspxhttp://geekswithblogs.net/rajeevr/archive/2012/02/26/closures-and-captured-variable.aspx

    【讨论】:

      【解决方案2】:

      有一个带有参数的overload of the Thread.Start method。使用它,您可以避免关闭:

      for(int i = 0; i < 10; i ++)
      {
          new Thread(o => Test((int)o)).Start(i);
      }
      

      【讨论】:

        【解决方案3】:

        更新(适用于 .net 4.0 及更高版本): 您可以编写一个Parallel.For 循环来代替for 循环,这将真正利用并行处理。

          Parallel.For(0, 10, i =>
                    {
                        new Thread(() => Test(i)).Start();
                    });
        

        【讨论】:

          猜你喜欢
          • 2013-10-01
          • 2012-10-19
          • 2020-04-16
          • 1970-01-01
          • 2011-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-29
          相关资源
          最近更新 更多