在for循环中创建新线程并传递参数

本文关键字:线程 参数 循环 for 创建 新线程 | 更新日期: 2023-09-27 18:09:04

考虑以下代码:

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

Test(int i)函数:

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

实际输出:

=== Test 3
===测试4
===测试4
===测试5
===测试5
===测试5
===
===
===
===试验10

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

预期输出:

我希望看到所有的数字都是随机的。

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

在for循环中创建新线程并传递参数

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

你的问题是闭包捕获变量

将代码更改为

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

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

线程过载。接受参数的Start方法。使用它,您可以避免闭包:

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

更新(适用于。net 4.0以后):而不是for循环,你可以写一个并行。For循环,它将真正利用并行处理。

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