首页 > 解决方案 > C# - 将参数传递给 Thread 时出现问题

问题描述

我的多线程应用程序有问题。
我有一个包含 4 个线程的数组。
这是我初始化它们的方法:

for (int i = 0; i < threads.Length; i++)
{
    threads[i] = new Thread(delegate () { ThreadMethod(i); });
}

但是在我的第一次测试之后,我发现所有四个线程都以3传递的值运行。
我把它改成

for (int i = 0; i < threads.Length; i++)
{
    int id = i;
    threads[i] = new Thread(delegate () { ThreadMethod(id); });
}

它有效,但对我来说,似乎必须有更好的方法将我传递i给我的线程。

我的猜测是否正确,如果是,我应该如何通过i

谢谢!

标签: c#multithreading

解决方案


闭包使用局部变量——在 for 循环中,为循环声明的变量不是局部变量,它们必须在块 ( {}) 内。这就是第二个示例有效的原因。

delegate 关键字是创建闭包的对象,它会查找要包含在闭包中的局部变量。当它找到 id 时,它包含它。当它不引用时,它引用的全局(闭包外)值,i并且在运行时i的值为 3。


推荐阅读