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#
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]));
}
不过还有一个问题,你在那一个帖子里提到C#4.5中编译器做出了改变,我用的是vs2012,C#版本为4.5.50709,仍然出现了上边的问题,在我单步调试原来代码的时候,出现了下面的结果ts
看上去好像是在异步执行,然后从中截取了几个结果,Result=“”就是我所希望得到的文件夹的名字,应该是有9个不同的名字,这里是取到了其中的3个,既不是只有最后一个,也不是9个都有。
而我不使用单步,一次运行下来的时候,就会出现i超出了数组界限的错误,整个运行过程实在是有些费解。
不知道是我没明白你的意思还是你没明白我的意思,我不是你那样的高手,请你不要以你的眼光来评价别人。
如果你自觉水平比较高,就拿出点有用的东西来,不要在那里大放厥词。