[英]Ensuring primary thread waits for all Tasks to complete
我正在編寫一個C#控制台應用程序,並且遇到一個問題,即在所有產生的Tasks有機會完成之前,主線程已關閉。 常規程序流程如下所示:
該程序將目錄路徑作為命令行參數。 然后,它將遍歷該目錄中與特定擴展名匹配的每個文件,並為每個匹配文件產生一個新任務以打開並分析該文件:
Directory.GetFiles(directoryPath).ToList<string>().Where(x => Path.GetExtension(x) == ".xfast").ToList().ForEach(x => ProcessXFastFile(x));
這些文件中的每個文件都包含大量CSV值,它們對應於唯一的產品密鑰。 例如,一個文件可能包含一百萬條CSV行和400個唯一的產品密鑰。 程序的重點是根據產品密鑰對所有行進行排序,然后根據密鑰將它們寫回到單獨的文件中。
因此,在ProcessXFastFile方法中,我使用產品代碼作為鍵值創建Dictionary<string, List<string>>
,並將與該鍵匹配的每個CSV行添加到相應的列表中。
排序完成后,我遍歷字典並為每個Key值產生一個新任務,並在該List中寫出CSV行:
foreach (KeyValuePair<string, List<string>> entry in productDictionary) {
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour, entry.Key);
List<string> quotes = entry.Value;
Task writeFileTask = Task.Factory.StartNew(() => WriteProductFile(writePath, quotes));
}
問題是主線程在WriteProductFile這些任務中的每一個有機會完成寫出它們的數據之前就已經結束了。 例如,我使用一個文件作為對照測試,並且知道字典中大約有450個唯一鍵,因此應該寫出許多相應的文件。 但是,只有大約10個文件有機會在程序結束之前寫出。
我如何確保我的程序保持足夠長的壽命以完成所有任務? 任何幫助表示贊賞。
您可以將獲得的所有任務放入List<Task>
而不僅僅是創建並Task.WaitAll()
它們,然后使用Task.WaitAll()
等待完成:
var tasks = new List<Task>();
foreach (KeyValuePair<string, List<string>> entry in productDictionary) {
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour, entry.Key);
List<string> quotes = entry.Value;
// add task to list
tasks.Add(Task.Factory.StartNew(() => WriteProductFile(writePath, quotes)));
}
// now wait for all tasks to finish, you'd also want to handle exceptions of course.
Task.WaitAll(tasks.ToArray());
WaitAll()
有很多變體,您可以無限期地等待(如上所述),或者等待TimeSpan
,如果超時則打印進度消息並再次等待,等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.