DirectoryInfo Di = new DirectoryInfo(LibPath);
            DirectoryInfo[] directory = Di.GetDirectories();
            int LibNo = directory.Length;
            Task<DataTable>[] ts = new Task<DataTable>[LibNo];
            for (int i = 0; i < LibNo; ++i)
            {
                ts[i] = Task.Factory.StartNew(() => Single_Lib(directory[i]));
            }
            Task.WaitAll(ts);有这么一段代码,是想在路径“LibPath”中获取文件夹数,即库文件夹的数量LibNo,然后开启LibNo个Task线程,使用上面代码的时候,运行到最后一行Task.WaitAll(ts)时,会出现第7行”directory[i]索引超出了数组界限“的错误。
把for循环部分改为:            if (LibNo >= 5)
            {
                ts[0] = Task.Factory.StartNew(() => Single_Lib(directory[0]));
                ts[1] = Task.Factory.StartNew(() => Single_Lib(directory[1]));
                ts[2] = Task.Factory.StartNew(() => Single_Lib(directory[2]));
                ts[3] = Task.Factory.StartNew(() => Single_Lib(directory[3]));
                ts[4] = Task.Factory.StartNew(() => Single_Lib(directory[4]));
            }
            if (LibNo >= 6)
                ts[5] = Task.Factory.StartNew(() => Single_Lib(directory[5]));
            if (LibNo >= 7)
                ts[6] = Task.Factory.StartNew(() => Single_Lib(directory[6]));
            if (LibNo >= 8)
                ts[7] = Task.Factory.StartNew(() => Single_Lib(directory[7]));
就可以实现预期功能,哪位能给解释下,上边的代码为什么会出现那种错误,应该做何修改,能够动态判断LibNo的数量,精简代码。Task 线程 C#

解决方案 »

  1.   


                for (int i = 0; i < LibNo; ++i)
                {
                    ts[i] = Task.Factory.StartNew(() => Single_Lib(directory[i]));
                }=》            for (int i = 0; i < LibNo; ++i)
                {
                    int index = i;
                    ts[i] = Task.Factory.StartNew(() => Single_Lib(directory[index]));
                }
      

  2.   

    ++i 改为i++,否则还没执行for循环,i就已经加一了
      

  3.   

    表达式的值和 i < LibNo 没关系
      

  4.   

    阿非是正解。这个问题很类似我在 http://bbs.csdn.net/topics/380240169 中讨论的那个问题。
      

  5.   

    的确是这个原因,我对Lambda了解的太少了,还只是学了个样子而已。
    不过还有一个问题,你在那一个帖子里提到C#4.5中编译器做出了改变,我用的是vs2012,C#版本为4.5.50709,仍然出现了上边的问题,在我单步调试原来代码的时候,出现了下面的结果ts
    看上去好像是在异步执行,然后从中截取了几个结果,Result=“”就是我所希望得到的文件夹的名字,应该是有9个不同的名字,这里是取到了其中的3个,既不是只有最后一个,也不是9个都有。
    而我不使用单步,一次运行下来的时候,就会出现i超出了数组界限的错误,整个运行过程实在是有些费解。
      

  6.   

    跟lamda没有关系。看来你还是完全没有搞清楚是怎么回事。后边的所谓Result也是一样的原因。你把它归结为“我对lamda了解太少”,这就是睁着眼睛来欺骗你自己。
      

  7.   

    跟lamda没有关系。看来你还是完全没有搞清楚是怎么回事。后边的所谓Result也是一样的原因。你把它归结为“我对lamda了解太少”,这就是睁着眼睛来欺骗你自己。
    不知道是我没明白你的意思还是你没明白我的意思,我不是你那样的高手,请你不要以你的眼光来评价别人。
    如果你自觉水平比较高,就拿出点有用的东西来,不要在那里大放厥词。