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

分享_18

时间:2023-04-11 02:14:23 C#

因为循环超出了usingSystem的作用域;使用System.Collections.Generic;使用系统文本;使用System.Threading.Tasks;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){MyClassmyClass=newMyClass();myClass.StartTasks();}}类MyClass{int[]arr;publicvoidStartTasks(){arr=newint[2];arr[0]=100;arr[1]=101;对于(inti=0;iWorkerMethod(arr[i]));//IndexOutOfRangeException:i==2!!!}}voidWorkerMethod(inti){}}}似乎i++在循环迭代完成之前再次执行。为什么会出现IndexOutOfRangeException?您正在关闭循环变量。当调用WorkerMethod时,我可以获得值2而不是0或1。当你使用闭包时,重要的是要明白你不是在使用变量的当前值,而是在使用变量本身。因此,如果您在这样的循环中创建一个lambda:for(inti=0;i{Console.WriteLine(i)};}并执行操作,它们将全部打印“2”,因为这是i的值。在循环中引入一个局部变量将解决你的问题:for(inti=0;iWorkerMethod(arr[index]));}这是尝试Resharper的另一个原因——它会给出很多警告,可以帮助你发现问题likethisearlyThebug."Closingaloopvariable"isinitandthereasonisyouareusingaloopvariableinaparalleltask.由于任务可以并发执行,因此循环变量的值可能与when不同youstartedthetask.你在循环中开始了任务。当任务来查询循环变量时,循环已经结束,因为变量i现在超出了停止点。即:您应该使用Parallel.For并行执行循环体。下面是一个如何使用Parallel.For的例子另外,如果你想保持当前的结构,你可以将i复制到一个循环局部变量中,循环局部变量将它的值保存到并行任务中。例如for(inti=0;iWorkerMethod(arr[localIndex]));}使用foreach不会抛出:foreach(variinarr){Task.Factory.StartNew(()=>WorkerMethod(i));但这也不起作用:101101它使用数组中的最后一个条目执行WorkerMethod。为什么在其他答案中有很好的解释。这确实有效:Parallel.ForEach(arr,item=>Task.Factory.StartNew(()=>WorkerMethod(item)));注意这实际上是我第一次亲身体验System.Threading.Tasks。我发现这个问题、我天真的答案,尤其是其他一些对我个人学习经验有用的答案。我会在这里留下我的答案,因为它可能对其他人有用。以上就是C#学习教程:因为循环不在分享范围内,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: