因爲讀取文件的IO操作,那麼async/await
做法似乎這個任務最好的方法。
您不需要浪費線程來等待IO讀取或寫入文件。讀取或寫入文件是包含「等待」IO設備響應的操作。創建單獨的線程什麼都不做 - >只有等待就是浪費資源並且不會給你的應用程序帶來任何價值。
通過使用async/await
您可以只用一個線程完成相同的工作。當第一個任務正在等待文件被讀取時,另一個任務將會啓動,依此類推。
你可以讓你ToDo
方法作品異步
public async Task ToDoAsync(string file)
{
using (var fileReader = File.OpenText(file))
{
var allFile = await fileReader.ReadToEndAsync();
// and do something
}
}
,然後用它
var files = Directory.EnumerateFileSystemEntries(@"E:\Nouveau dossier (2)", "*.*", SearchOption.AllDirectories);
var tasks = new List<Task>();
foreach (var f in files)
{
var task = ToDoAsync(f);
tasks.Add(task);
}
await Task.WhenAll(tasks.ToArray());
因此獲得更好的性能和使用您需要將您的邏輯分爲兩個部分資源的更好,因爲在@Zoran答案中提到。
- 可以在異步的方式進行,可以在「水貨」來完成
- 處理數據讀取文件
如果該文件的處理是耗時的部分,運算不得創建比核心數更多的線程。當一個線程以一個(或n個)文件結束時,它應該獲取下一個文件數據(或下一個n個文件數據)進行處理,在此操作期間鎖定文件數據列表。 – Graffito
這是真的,但我不希望看到處理花費的時間比加載內容更多的情況。這也是爲什麼我建議在沒有處理的情況下測量性能,只有在加載的情況下才能測量性能,並且看到 - 如果這與包括處理的時間大致相同,那麼將IO看起來成爲瓶頸是沒有意義的。 –
解析XML文件通常比閱讀它們要長。 – Graffito