2010-07-04 97 views
0

我有一個C#應用程序,用於從聯機數據倉庫下載.xml文件列表。此應用程序將文件轉儲到本地目錄,並且在所有10k文件下載完成前大約需要1個小時。這是一個每日過程。如何使用C#多線程處理文件目錄

我需要採取這些文件中的每一個,並提取,轉換和加載包含的數據到數據庫。我想在下載的同時執行此操作,因爲我不希望等到所有文件都下載完畢才能啓動ETL過程。不幸的是,XML文件包含大量的數據,所以我一次只能處理大約10個文件。什麼是實現我的並行加載要求的好策略?

+1

到目前爲止你有什麼策略?你有什麼其他的限制?什麼大小的文件?多少數據?你目前的ETL過程是什麼? – Oded 2010-07-04 12:39:18

+0

唯一的約束是我不能有太多(因爲每個文件都被加載到DOM中)文件被同時加載。文件大小爲2MB。有10k個文件。 ELT過程由解析XML並將解析的數據寫入SQL Server數據庫的.exe組成。 – Guazz 2010-07-04 12:46:58

+0

不是一個笨蛋,而是相關的:http://stackoverflow.com/questions/3135237/ – 2010-07-04 14:44:10

回答

0

您可以通過thread pools來優化您的情況。

首先將所有要下載的文件添加到受同步保護的隊列中。

您將擁有一個用於下載文件的線程池,當即將下載文件時,將其從要下載的文件列表中刪除。成功下載文件後,將其添加到要處理的另一工作隊列中。如果出現某種錯誤,可以將其重新添加到要下載的文件隊列中。如果隊列中沒有更多文件要下載,每個線程都會自行結束。

運行時,您將擁有另一個用於處理實際XML文件的線程池,工作線程池將從已下載的XML文件隊列中取得。如果沒有更多下載的XML文件需要處理,並且另一個線程池已經完成,則每個線程都會自行結束。

確保你照顧同步考慮對隊列(例如:與插入,刪除一個互斥體保護,...)

通過使用線程池,你可以設置多少個線程在不影響使用程序邏輯。您可以根據您想要採用的資源數量以及其他考慮因素(如太多的線程池沒有任何好處)來確定最佳值,並且只會將CPU集中在任務切換上。

0

如果您的需求太複雜,您可能需要查看Parallel.ForEach/Parallel.For。此外,新的Task類(TaskFactory.StartNew(...))和延續(例如下載完成,然後進入處理函數)。