gpt4 book ai didi

c# - 在 foreach 循环中启动一个新线程

转载 作者:IT王子 更新时间:2023-10-29 04:29:10 24 4
gpt4 key购买 nike

我有一个对象列表,我想遍历该列表并启动一个新线程,传入当前对象。

我已经写了一个我认为应该这样做的例子,但它不起作用。具体来说,线程似乎在每次迭代中都被覆盖了。不过,这对我来说并没有什么意义,因为我每次都在创建一个新的 Thread 对象。

这是我写的测试代码

class Program
{
static void Main(string[] args)
{
TestClass t = new TestClass();
t.ThreadingMethod();
}
}

class TestClass
{
public void ThreadingMethod()
{
var myList = new List<MyClass> { new MyClass("test1"), new MyClass("test2") };

foreach(MyClass myObj in myList)
{
Thread myThread = new Thread(() => this.MyMethod(myObj));
myThread.Start();
}
}

public void MyMethod(MyClass myObj) { Console.WriteLine(myObj.prop1); }
}

class MyClass
{
public string prop1 { get; set; }

public MyClass(string input) { this.prop1 = input; }
}

我机器上的输出是

test2
test2

但我希望它是

test1
test2

我尝试将线程更改为

ThreadPool.QueueUserWorkItem(x => this.MyMethod(myObj));

但是没有线程启动。

我想我只是对线程应该如何工作有误解。有人可以指出我正确的方向并告诉我我做错了什么吗?

最佳答案

这是因为您在错误的范围内关闭了一个变量。这里的解决方案是在你的 foreach 循环中使用一个临时的:

    foreach(MyClass myObj in myList)
{
MyClass tmp = myObj; // Make temporary
Thread myThread = new Thread(() => this.MyMethod(tmp));
myThread.Start();
}

有关详细信息,我建议阅读 Eric Lippert 关于此主题的帖子:Closing over the loop variable considered harmful

关于c# - 在 foreach 循环中启动一个新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418554/

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