如何使用C#多线程处理文件目录

时间:2010-07-04 12:36:58

标签: c# multithreading

我有一个C#应用程序,可以从在线数据仓库下载.xml文件列表。此应用程序将文件转储到本地目录,大约需要1小时才能下载所有10k文件。这是一个日常过程。

我需要获取这些文件中的每一个,并将包含的数据提取,转换并加载到数据库中。我想与下载并行执行此操作,因为我不想等到所有文件都下载后再开始ETL过程。不幸的是,XML文件包含大量数据,因此我一次可以ETL大约10个文件。实现并行加载要求的好策略是什么?

2 个答案:

答案 0 :(得分:0)

您可以使用thread pools来优化您的情况。

首先将要下载的所有文件添加到受同步保护的队列中。

您将拥有一个用于下载文件的线程池,当要下载文件时,您将其从要下载的文件列表中删除。成功下载文件后,将其添加到另一个要处理的工作队列中。如果存在某种错误,您可以将其重新添加到要下载的文件队列中。如果队列中没有更多文件要下载,则每个线程都会自行结束。

当它正在运行时,您将拥有另一个用于处理实际XML文件的线程池,工作线程池将从已下载的XML文件的队列中获取。如果没有更多下载的XML文件要处理,并且另一个线程池已经完成,则每个线程将自行结束。

确保在队列中处理同步注意事项(例如:使用互斥锁进行保护以便插入,删除......)

通过使用线程池,您可以设置要使用的线程数,而不会影响程序逻辑。您可以根据要使用的资源数来确定最佳值,而其他考虑因素(如太多线程池)没有任何好处,只会将CPU过多地集中在任务切换上。

答案 1 :(得分:0)

如果这对您的需求来说过于复杂,您可能需要查看Parallel.ForEach / Parallel.For。此外,新的Task类(TaskFactory.StartNew(...))和continuation(例如下载完成然后转到处理函数)。