Поскольку чтение файлов являются операции ввода-вывода, то 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.
- Чтение файлов, которые могут быть сделаны в асинхронном способом
- обработки данных, которые можно сделать в «Parallel»
Если обработка файла является трудоемкой частью, оп не должен создавать больше потоков, чем число ядер. Когда поток заканчивается одним (или n) файлом, он должен получить следующие данные файла (или следующие данные n файлов) для обработки, блокируя список данных файлов во время этой операции. – Graffito
Это правда, но я не ожидаю увидеть случай, когда обработка занимает больше времени, чем загрузка содержимого. Именно поэтому я предложил измерить производительность без обработки, только с загрузкой и увидеть - если это примерно то же самое, что и время, которое включает в себя обработку, тогда нет смысла распараллеливать что-либо, поскольку IO кажется узким местом. –
Разбор XML-файлов обычно длиннее, чем чтение. – Graffito