我没什么问题。
我的意见: 配置 - 此时包含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();
我有什么:
答案 0 :(得分:4)
对变量'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 - 按值复制),因此共享使用配置将在每次调用时提供不同的配置。
尽管如此,我确信有更好的方法来处理这些线程,并相应地使用更安全的值。