场景为一个list集合存放了文件的路径信息采用Parallel.ForEach循环list后循环莫名其妙的丢失了很多次
使用foreach循环就没有毛病代码如下
其中filterFileList为存有文件路径信息的集合。
sw = Stopwatch.StartNew();
int count = 0;
int enExists = 0;
try
{
Parallel.ForEach(filterFileList, currentFile =>
{
FileInfo fileObj = new FileInfo(currentFile);
if (fileObj.Exists)
{
fileCountL += fileObj.Length;
count++;
}
else
{
enExists++;
}
});
}
catch (AggregateException aex)
{
foreach (var ex in aex.InnerExceptions)
{
Logger.Error(ex.Message);
}
}
elapsed = sw.ElapsedMilliseconds.ToString();
Logger.Info(“Parallel.ForEach用时:” + elapsed + “毫秒,文件累计大小:” + GetFileSize(fileCountL) + “有” + count + “份文件,有” + enExists + “份文件无法找到”);
fileCountL = 0;
count = 0;
sw = Stopwatch.StartNew();
foreach (String str in filterFileList)
{
try
{
FileInfo fileObj = new FileInfo(str);
if (fileObj.Exists)
{
fileCountL += fileObj.Length;
count++;
}
}
catch (Exception)
{
continue;
}
}
elapsed = sw.ElapsedMilliseconds.ToString();
Logger.Info(“foreach用时:” + elapsed + “毫秒,文件累计大小:” + GetFileSize(fileCountL) + “有” + count + “份文件,有” + enExists + “份文件无法找到”);
日志如下:
2016-07-15 12:51:09 001 Info Parallel.ForEach用时:1303毫秒,文件累计大小:260 GB有87301份文件,有0份文件无法找到
2016-07-15 12:51:13 001 Info foreach用时:3060毫秒,文件累计大小:263 GB有87385份文件,有0份文件无法找到
如上,集合大小为87385 foreach循环次数是对的,但是Parallel.ForEach就少了.
不知道问题出在哪里?
使用foreach循环就没有毛病代码如下
其中filterFileList为存有文件路径信息的集合。
sw = Stopwatch.StartNew();
int count = 0;
int enExists = 0;
try
{
Parallel.ForEach(filterFileList, currentFile =>
{
FileInfo fileObj = new FileInfo(currentFile);
if (fileObj.Exists)
{
fileCountL += fileObj.Length;
count++;
}
else
{
enExists++;
}
});
}
catch (AggregateException aex)
{
foreach (var ex in aex.InnerExceptions)
{
Logger.Error(ex.Message);
}
}
elapsed = sw.ElapsedMilliseconds.ToString();
Logger.Info(“Parallel.ForEach用时:” + elapsed + “毫秒,文件累计大小:” + GetFileSize(fileCountL) + “有” + count + “份文件,有” + enExists + “份文件无法找到”);
fileCountL = 0;
count = 0;
sw = Stopwatch.StartNew();
foreach (String str in filterFileList)
{
try
{
FileInfo fileObj = new FileInfo(str);
if (fileObj.Exists)
{
fileCountL += fileObj.Length;
count++;
}
}
catch (Exception)
{
continue;
}
}
elapsed = sw.ElapsedMilliseconds.ToString();
Logger.Info(“foreach用时:” + elapsed + “毫秒,文件累计大小:” + GetFileSize(fileCountL) + “有” + count + “份文件,有” + enExists + “份文件无法找到”);
日志如下:
2016-07-15 12:51:09 001 Info Parallel.ForEach用时:1303毫秒,文件累计大小:260 GB有87301份文件,有0份文件无法找到
2016-07-15 12:51:13 001 Info foreach用时:3060毫秒,文件累计大小:263 GB有87385份文件,有0份文件无法找到
如上,集合大小为87385 foreach循环次数是对的,但是Parallel.ForEach就少了.
不知道问题出在哪里?
解决方案
100
线程中访问公共资源要加锁