簡體   English   中英

確保主線程等待所有任務完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM