gpt4 book ai didi

C# - 使用 Lambda 创建多线程

转载 作者:行者123 更新时间:2023-11-30 16:24:23 24 4
gpt4 key购买 nike

public void GatherDataFromSwitches(Device[] switches)
{
List<Thread> workerThreads = new List<Thread>();
for(int i = 0; i < switches.Length - 1; i++)
{
Thread t = new Thread(unused => GatherDataFromSwitch(switches[i]));
workerThreads.Add(t);
t.Start();
}
foreach (Thread d in workerThreads) d.Join(); //wait for all threads to finish
}

如果我在运行该方法后遍历交换机,我会注意到有些交换机不知何故没有添加数据,而有些交换机有从多个交换机添加的数据。因此,将引用传递给工作线程时出了点问题。我仍然不确定到底是什么,但我通过添加解决了问题

Thread.Sleep(100); 

紧接着

t.Start();

我假设这是可行的,因为现在新创建的线程在创建下一个线程之前有一些时间进行初始化。但这是一种解决方法,而不是修复方法。是因为 lambda 表达式的工作原理吗?

我该如何正确解决这个问题?

最佳答案

问题是在 lambda 中捕获 i 的方式。在循环内制作一个本地副本,让每个 lambda 捕获一个不同的值:

public void GatherDataFromSwitches(Device[] switches)
{
List<Thread> workerThreads = new List<Thread>();
for(int i = 0; i < switches.Length ; i++)
{
int j = i; // local i
Thread t = new Thread(unused => GatherDataFromSwitch(switches[j]));
workerThreads.Add(t);
t.Start();
}
foreach (Thread d in workerThreads) d.Join(); //wait for all threads to finish
}

或者将i作为参数显式传递给线程:

public void GatherDataFromSwitches(Device[] switches)
{
List<Thread> workerThreads = new List<Thread>();
for(int i = 0; i < switches.Length ; i++)
{
Thread t = new Thread(param => { j = (int)param; GatherDataFromSwitch(switches[j]); });
workerThreads.Add(t);
t.Start(i);
}
foreach (Thread d in workerThreads) d.Join(); //wait for all threads to finish
}

关于C# - 使用 Lambda 创建多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com