我没什么问题
我的输入:
配置-目前包含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-按值复制),因此配置的共享使用将在每次调用时提供不同的配置.
不过,我确信有更好的方法来处理这些线程,并相应地使用更安全的值.