线程参数被更改

时间:2015-12-16 18:18:16

标签: c# .net multithreading .net-4.5

当启动多个线程时,我正在解析的id参数有时是错误的。这是我的创业公司:

for (int i = 0; i < _threadCount; i++)
{
    Thread thread = new Thread(() => WorkerThread(i));
    thread.Start();
    _threads.Add(thread);
}

我的线程功能:

private void WorkerThread(int id)
{
    Console.WriteLine("[{0}] Thread started {1}", DateTime.Now.ToLongTimeString(), id);
}

此代码的输出为:

[19:10:54] Thread start 3
[19:10:54] Thread start 9
[19:10:54] Thread start 4
[19:10:54] Thread start 12
[19:10:54] Thread start 11
[19:10:54] Thread start 3
[19:10:54] Thread start 12
[19:10:54] Thread start 6
[19:10:54] Thread start 9
[19:10:54] Thread start 6
[19:10:54] Thread start 13
[19:10:54] Thread start 2
[19:10:54] Thread start 15
[19:10:54] Thread start 9
[19:10:54] Thread start 15

在我看来,这段代码应创建具有唯一id的每个帖子,而不是如上所示的重复。

编译器信息:

平台目标:x64

目标框架:.NET Framework 4.5

2 个答案:

答案 0 :(得分:13)

在启动主题后,您应该注意意外修改捕获的变量,例如i,因为i 共享i变量在整个循环的生命周期中引用相同的内存位置。 解决方案是使用临时变量,如下所示:

for (int i = 0; i < _threadCount; i++)
{
      var i1 = i;
      Thread thread = new Thread(() => WorkerThread(i1));
      thread.Start();
      _threads.Add(thread);
}

在此处详细了解 Closures The Beauty of Closures from (Jon Skeet)Lambda expressions and captured variables from (Joseph Albahari).

答案 1 :(得分:0)

问题是i变量通过循环的生命周期引用相同的内存位置。因此,每个线程都会调用一个变量,该变量的值可能会在运行时发生变化。解决方案是使用临时变量int temp = i。正如@ S.Akbari所说。