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

C# 如何使用C多线程处理目录中的文件,c#,multithreading,C#,Multithreading,我有一个C应用程序,可以从在线数据仓库下载.xml文件列表。该应用程序将文件转储到本地目录中,大约需要1小时才能下载所有10k文件。这是一个日常过程 我需要获取这些文件中的每一个,提取、转换并将包含的数据加载到数据库中。我想在下载的同时做这件事,因为我不想等到所有的文件都下载了之后才开始ETL过程。不幸的是,XML文件包含大量数据,因此我一次可以ETL大约10个文件。实现我的并行加载要求的好策略是什么?您可以使用一些工具来优化您的情况 首先将要下载的所有文件添加到受同步保护的队列中 您将拥有一个

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


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

您可以使用一些工具来优化您的情况

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

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

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

请确保注意队列上的同步注意事项,例如:使用互斥锁进行插入、删除等保护


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

如果这对于您的需要来说太复杂,您可能需要查看Parallel.ForEach/Parallel.for。另外,新的任务类TaskFactory.StartNew。。。和继续,例如,下载完成后再转到处理功能。

到目前为止,您想出了哪些策略?你还有什么其他的限制?多大的文件?有多少数据?您当前的ETL过程是什么?唯一的限制是,我不能有太多的文件,因为每个文件都加载到DOM中,同时加载文件。每个文件约2MB。有10k个文件。ELT进程由一个.exe组成,该.exe解析XML并将解析后的数据写入SQL Server数据库。该进程不是重复的,但与以下内容密切相关: