当前位置:  开发笔记 > 编程语言 > 正文

线程参数被更改

如何解决《线程参数被更改》经验,为你挑选了1个好方法。

当启动多个线程时,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



1> Salah Akbari..:

你应该注意i在启动线程之后意外修改捕获的变量,因为它i共享的.该i变量指向同一个内存位置在整个循环的寿命.该溶液是使用临时变量是这样的:

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

阅读更多关于闭包的信息:闭塞之美(Jon Skeet)和Lambda表达式以及(Joseph Albahari)的变量.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有