【发布时间】:2010-07-21 05:49:45
【问题描述】:
我正在尝试遍历所有文件和文件夹,并对所有具有特定扩展名的文件执行操作。这种方法效果很好,但我想让它成为多线程的,因为当完成数以万计的文件时,它真的很慢,我会使用多线程进行成像会加快速度。我只是不确定在这种情况下如何使用线程。
doStuff 从文件中读取属性(修改日期等)并将它们插入到 sqlite 数据库中。我在调用扫描方法之前启动事务,以便尽可能优化。
提供有关如何做到这一点的理论的答案与完整的工作代码答案一样好。
private static string[] validTypes = { ".x", ".y", ".z", ".etc" };
public static void scan(string rootDirectory)
{
try
{
foreach (string dir in Directory.GetDirectories(rootDirectory))
{
if (dir.ToLower().IndexOf("$recycle.bin") == -1)
scan(dir);
}
foreach (string file in Directory.GetFiles(rootDirectory))
{
if (!((IList<string>)validTypes).Contains(Path.GetExtension(file)))
{
continue;
}
doStuff(file);
}
}
catch (Exception)
{
}
}
【问题讨论】:
-
这是题外话,但你不应该捕获所有异常。
-
是的,我同意。为了简单起见,我删除了那部分(因为这是一个 winforms 应用程序)
-
为什么你会认为多线程会加快速度? 线程不会神奇地让你的磁盘运行得更快。线程可以让你的磁盘运行得变慢,因为磁盘控制器现在有更多的事情要做。您能解释一下为什么您认为多线程解决方案会更快吗?
-
@Eric:在实践中,线程可以加快 I/O。原因之一是线程没有 100% 地执行 I/O,因此额外的线程可以填补空白。另一个是 I/O 是延迟可能导致总带宽的未充分利用,而重叠的请求可能会完全填满管道。这就是理论:实践是它的基准测试速度更快。
-
这是有道理的,因为当我插入 sqlite 数据库时,我可以从下一个文件开始。