c# - 正在更改的线程参数

标签 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

最佳答案

在启动线程后,您应该小心不要意外修改捕获的变量,如 i,因为 i共享的i 变量在整个循环的生命周期中指向相同的内存位置。 解决方案是使用这样的临时变量:

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

在此处阅读有关闭包的更多信息:The Beauty of Closures from (Jon Skeet)Lambda expressions and captured variables from (Joseph Albahari).

关于c# - 正在更改的线程参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319303/

相关文章:

c# - 计时器线程是等到回调函数中的所有步骤都完成还是回调函数在每个周期都被重新调用

c# - 如何在Silverlight应用程序中向SQL表中插入数据?

c# - Reflection.Emit - IL - 对象上的调用方法

c# - 将 SelectedObjectCollection 转换为特定类型的集合

c# - System.AccessViolationException 与 SQLite

.net - Scala.net 中的 Actor

multithreading - 使用 Qt 增强 asio

java - 初始化ThreadLocal变量时传递参数

c# - 在@using 语句中使用三元

c# - 有问题的 if 语句