c# - 并行代码抛出 OutOfRangeException

标签 c# exception .net-4.0 out-of-memory parallel-processing

有谁知道为什么这段代码会返回超出范围的异常?
例如,如果 leastAbstractions List 实例具有 count == 10,则循环将执行 11 次,并以 i = 10 结束code> 并返回此异常。

 for (int i = 0; i < leastAbstractions.Count; i++)
 {
     Task.Factory.StartNew((object state) =>
     {
         this.Authenticate(new HighFragment(leastAbstractions[i])).Reactivate();
     }, TaskCreationOptions.PreferFairness);
 }  

最佳答案

您的循环实际上并未执行 11 次 - 它只执行了 10 次,但当其中一些任务执行时 i == 10。

这是正常问题 - 您正在 lambda 表达式中捕获循环变量。只需复制计数器并捕获它即可:

for (int i = 0; i < leastAbstractions.Count; i++)
 {
     int copy = i;
     Task.Factory.StartNew((object state) =>
     {
         this.Authenticate(new HighFragment(leastAbstractions[copy]))
                                     .Reactivate();
     }, TaskCreationOptions.PreferFairness);
 }

这样,当您的任务执行时,您将看到捕获的 copy “实例”的当前值 - 并且该值永远不会改变,与 i 的值不同.

请参阅 Eric Lippert 的博客文章:part 1 ; part 2 .

关于c# - 并行代码抛出 OutOfRangeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4836721/

相关文章:

Python 只打印引发异常的回溯

wcf - 对象图中可以序列化或反序列化的最大项目数...

c# - 如何将 WaitAll 任务的结果分配给变量

c# - 'Emgu.CV.CvInvoke' 的类型初始值设定项抛出异常

c# - Azure 中的捆绑不适用于 bootstrap 和 jquery、ASP.NET MVC 5

java - junitparameter异常方法应该没有参数

c# - 如何解决 C# 中数据集内存不足异常错误?

c# - 自定义多因素 Active Directory 身份验证

c# - 如何对我的 WCF 客户端类进行单元测试?

c# - 无法加载文件或程序集 SMDiagnostics.dll