Я борюсь с параллелизмом в c # и связанным с ним шаблоном асинхронного ожидания.
Я столкнулся с проблемой производительности, потому что мне нужно использовать несколько провайдеров БД._schedulesProvider
содержит различные провайдеры.Я действительно не хочу ничего там менять, но моя идея состояла в том, чтобы выполнить эти дорогостоящие операции ввода-вывода одновременно.Я знаю, что было бы идеально использовать await async здесь, чтобы не блокировать вызывающий поток во время ожидания завершения операций ввода-вывода, но в данный момент я не очень беспокоюсь об этом.
рассмотрите следующий код:
//queuing all the expensive code in tasks
List<Task> scheduleProviderTasks = _schedulesProvider.Select(scheduleProvider =>
{
return
Task.Run(() =>
{
//expensive I/O operation
var schedules = scheduleProvider.Get();
if (!schedules.Schedules.Any())
{
return;
}
//do some stuff with the result
schedules.Schedules.ForEach(x =>
{
DoSomething(x);
});
});
}).ToList();
//run all tasks
scheduleProviderTasks.ForEach(x=>x.RunSynchronously());
что я ожидаю:
затраты на эту операцию теперь должны быть намного ниже, поскольку дорогостоящие операции выполняются параллельно.
текущий поток блокируется до scheduleProviderTasks.ForEach(x=>x.RunSynchronously());
и, следовательно, все операции завершены.
Это правда?Должен ли я рефакторинг этого кода?