我正在写一个函数来获取目录中的所有文件,但通过将每个子目录添加到线程池中并行执行。我认为这将意味着每个目录将被并行遍历,并且由于有许多子目录,它会比顺序执行要快得多。我的代码如下:线程池是否按顺序运行?
private object addlock = new object();
private void addFiles(string[] newFiles)
{
lock (addlock) {
files.AddRange(newFiles);
Console.WriteLine("Added {0} files", newFiles.Length);
}
}
private void getFilesParallel(string dir)
{
if (!Directory.Exists(dir)) {
return;
}
string[] dirs = Directory.GetDirectories(dir, "*", SearchOption.TopDirectoryOnly);
ManualResetEvent mre = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((object obj) =>
{
addFiles(Directory.GetFiles(dir, "*", SearchOption.TopDirectoryOnly));
mre.Set();
});
Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64;
Console.WriteLine("Used {0}", memorySize);
foreach (string str in dirs) {
getFilesParallel(str);
}
mre.WaitOne();
}
的问题是,我得到这样的输出:
Added 34510 files
Used 301420544
Added 41051 files
Used 313937920
Added 39093 files
Used 322764800
Added 44426 files
Used 342536192
Added 30772 files
Used 350728192
Added 36262 files
Used 360329216
Added 31686 files
Used 368685056
Added 33194 files
Used 374894592
Added 34486 files
Used 384057344
Added 37298 files
Used 393998336
这表明我的代码运行顺序,因为我本来希望能够找到每个语句因为它们在不同的线程上运行。我使用不同的文件夹多次运行它,结果总是相同的。为什么这个顺序运行?
尝试使用一些ramdisk软件的多个虚拟磁盘驱动器。 6Gb/s是我的猜测。 – 2014-11-04 20:11:11