问题描述
这很棘手(也许不适合专家)。我正在学习C#中的并发性,并且在玩一些虚拟代码来测试线程的基础知识。我对以下代码有时会打印出 10 值的可能性感到惊讶。
Thread[] pool = new Thread[10];
for(int i = 0; i < 10; i++)
{
pool[i] = new Thread(() => Console.Write(i));
pool[i].Start();
}
典型输出类似于76881079777
。我知道值是 10 而不是1和0,因为for循环体执行了10次(不完全确定,但是我无法破坏C#)。我什至更惊讶为什么它在语句IndexOutOfRange
pool[i] = new Thread(() => Console.Write(i));
异常
据我所知,for循环执行如下:
- 检查条件(
i < 10
) - 如果条件为真,则执行正文
- 增加控制变量(
i++
) - 重复
因此,假设我无法理解如何使用值10执行主体。有什么想法吗?
解决方法
调用pool[i].Start();
并不意味着() => Console.Write(i)
立即被执行。取而代之的是,操作系统决定传递的方法何时执行(这也称为“计划”)。例如,操作系统可能会在循环完成后决定执行您的线程之一。在这种情况下,i
是10;因此这就是为什么可能输出10的原因。