关于Task批量动态定义的问题
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]));
}
[解决办法]
阿非是正解。
这个问题很类似我在 http://bbs.csdn.net/topics/380240169 中讨论的那个问题。