Когда данные на самом деле получены, это немного сложный вопрос, потому что вы используете DataReader.
По своей сути DataReader работает как Перечислители . Read () делает вещи, сравнимые с Current (Current является свойством, поэтому это вызов функции, не похожий на единицу). В обоих случаях я не могу сказать вам, когда именно Данные передаются / полностью встроены в память. Это деталь реализации. Я могу сказать вам, что он был полностью извлечен, когда Read / Current возвращает значение «Я закончил», а не следующий результат.
Если я создаю Enumerator из массива, то все данные уже находятся в памяти. И этот случай не редкость, это происходит каждый раз, когда вы вызываете цикл foreach! Foreach не работает с коллекциями, только с перечислителями. К счастью, получение перечислителя из коллекции настолько тривиально, что это неявное преобразование.
С другой стороны, перечислитель может быть построен из внешнего источника данных. Например, Directory.EnumerateFiles () или File.ReadLines () . Последнее, следующая строка загружается точно при вызове Current. Однако, если разработчик кода несколько умен, то следующие 1-многие результаты будут загружены в фоновом режиме между текущими вызовами. И сколько он загружает вперед, может даже зависеть от среды (сколько оперативной памяти вы должны тратить на это). Если при вызове Current данные уже есть, они возвращаются. Если нет, Current становится блокирующим вызовом до тех пор, пока не будет получен следующий результат.