gpt4 book ai didi

c# - C# 的奇怪线程

转载 作者:太空狗 更新时间:2023-10-29 22:23:59 30 4
gpt4 key购买 nike

我在使用 C# 线程时遇到了一个奇怪的问题。

这是我的示例程序,它使用线程“激活”agentList 中每个代理的 Print() 函数。

class Program {

static void Main(string[] args) {

List<Agent> agentList = new List<Agent>();

agentList.Add(new Agent("lion"));
agentList.Add(new Agent("cat"));
agentList.Add(new Agent("dog"));
agentList.Add(new Agent("bird"));

foreach (var agent in agentList) {
new Thread(() => agent.Print()).Start();
}

Console.ReadLine();
}
}

class Agent {
public string Name { get; set; }

public Agent(string name) {
this.Name = name;
}

public void Print() {
Console.WriteLine("Agent {0} is called", this.Name);
}
}

下面是我运行上面程序的结果:

Agent cat is called
Agent dog is called
Agent bird is called
Agent bird is called

但我期望的是包含所有 4 个代理的东西,例如

Agent lion is called
Agent cat is called
Agent dog is called
Agent bird is called

最令人惊奇的是,如果我在 foreach 之外调用线程,它会起作用!

class Program {
static void Main(string[] args) {
List<Agent> agentList = new List<Agent>();

agentList.Add(new Agent("leecom"));
agentList.Add(new Agent("huanlv"));
agentList.Add(new Agent("peter"));
agentList.Add(new Agent("steve"));

new Thread(() => agentList[0].Print()).Start();
new Thread(() => agentList[1].Print()).Start();
new Thread(() => agentList[2].Print()).Start();
new Thread(() => agentList[3].Print()).Start();


Console.ReadLine();
}
}

上面代码的结果正是我所期望的。那么这里的问题是什么?

最佳答案

你所拥有的是一个闭包。您正在关闭 foreach 循环内的变量。发生的情况是变量在您的线程启动之前被覆盖,因此您有两个具有相同值的迭代。

简单的解决方法是在使用 foreach 循环之前捕获它内的值:

foreach(var a in agentList)
{
var agent = a;
new Thread(() => agent.Print()).Start();
}

关于c# - C# 的奇怪线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8067305/

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