循环

时间:2017-03-01 09:08:51

标签: c# multithreading loops

我没什么问题。

我的意见:  配置 - 此时包含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();

预期结果: enter image description here

我有什么:

enter image description here

1 个答案:

答案 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 - 按值复制),因此共享使用配置将在每次调用时提供不同的配置。

尽管如此,我确信有更好的方法来处理这些线程,并相应地使用更安全的值。