当前位置: 首页 > 编程语言 > C#

在foreach循环中启动一个新线程分享

时间:2023-04-11 00:36:30 C#

在foreach循环中启动一个新线程我有一个对象列表,我想遍历列表并启动一个新线程,传入当前对象.我写了一个我认为它应该做的例子,但它不起作用。具体来说,线程似乎在每次迭代中都被覆盖。这对我来说真的没有意义,因为我每次都在创建一个新的Thread对象。这是我写的测试代码classProgram{staticvoidMain(string[]args){TestClasst=newTestClass();t.ThreadingMethod();}}classTestClass{publicvoidThreadingMethod(){varmyList=newList{newMyClass("test1"),newMyClass("test2")};foreach(MyClassmyObjinmyList){ThreadmyThread=newThread(()=>this.MyMethod(myObj));我的线程。开始();}}publicvoidMyMethod(MyClassmyObj){Console.WriteLine(myObj.prop1);}}classMyClass{publicstringprop1{get;放;}publicMyClass(stringinput){this.prop1=input;我的机器test2上的输出是test2但我希望它是test1test2我尝试将线程更改为ThreadPool.QueueUserWorkItem(x=>this.MyMethod(myObj));但是没有一个线程开始。我想我只是误解了线程是如何工作的。有人可以指出我正确的方向并告诉我我做错了什么吗?这是因为您在错误的范围内关闭了变量。这里的解决方案是在foreach循环中使用临时变量:foreach(MyClassmyObjinmyList){MyClasstmp=myObj;//创建临时线程myThread=newThread(()=>this.MyMethod(tmp));我的线程.Start();有关详细信息,我建议阅读EricLippert关于这个确切主题的帖子:闭环变量被认为是有害的问题是您在闭包中使用了对象的最新值。所以每个调用线程都会查看相同的值。要解决此问题,请将值复制到局部变量中:foreach(MyClassmyObjinmyList){MyClasslocalCopy=myObj;线程myThread=newThread(()=>this.MyMethod(localCopy));我的线程.开始();}同意Reid的回答(+1)。我想补充一点,如果您使用的是.NET4,则可能需要查看任务并行库以解决此类问题。特别是对于这种情况,请查看Parallel.ForEach()。如果顺序无关紧要Parallel.ForEach(myList,obj=>this.MyMethod(obj));编写一个简单的Parallel.ForEach循环我更喜欢这种方式:publicvoidThreadingMethod(){varmyList=newList{newMyClass("test1"),newMyClass("test2")};平行线。ForEach(myList,newParallelOptions(){MaxDegreeOfParallelism=100},(myObj,i,j)=>{MyMethod(myObj);});}虽然没测试过....以上就是C#学习教程:在foreach循环中新开一个线程分享全部内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢