循环的不同行为

我没什么问题

我的输入:
 配置-目前包含2个不同对象的集合.

结果看起来像执行了两次,但是参数相同.如果将断点放在循环中,我会看到不同的对象.我做错了什么?

    List<Thread> threads = new List<Thread>();

    foreach (var configuration in configurations)
    {
        Thread thread = new Thread(() => new DieToolRepo().UpdateDieTool(configuration));
        thread.Start();
        threads.Add(thread);
    }

    threads.WaitAll();

预期结果:
循环的不同行为

我有的:

循环的不同行为

解决方法:

变量“ configuration”没有歧义.

遵循@HenkHolterman的建议,我首先发布一个更干净,更精确的解决方案:

List<Thread> threads = new List<Thread>();
foreach (var configuration in configurations)
{
    var threadConfiguration = configuration;
    Thread thread = new Thread(() => DieToolRepo().UpdateDieTool(threadConfiguration );
    thread.Start();
    threads.Add(thread);
}
threads.WaitAll();

此外,您还可以使用for循环来解决此问题:

List<Thread> threads = new List<Thread>();
for (var index=0; index< configurations.Length; index++)
{
    Thread thread = new Thread(() => DieToolRepo().UpdateDieTool(configurations[index]));
    thread.Start();
    threads.Add(thread);
}
threads.WaitAll();

发生这种情况是因为在运行时所有线程的变量“ configuration”都是相同的.
使用此方法将创建索引的新副本(localIndex-按值复制),因此配置的共享使用将在每次调用时提供不同的配置.

不过,我确信有更好的方法来处理这些线程,并相应地使用更安全的值.

上一篇:java-继续/中断时不必要的标签


下一篇:PHP包装每4个元素