Подумайте ... сколько времени займет эта программа, чтобы произвести самый первый вывод, когда я == 0?Это должно быть мгновенно, верно?И через ленивую оценку yield
он должен производить продукцию в быстрой последовательности после этого, верно?
static void Main(string[] args)
{
Stopwatch stopwatch = Stopwatch.StartNew();
int i = 0;
foreach (var item in massiveYieldStatement())
{
if (i++ % 10000 == 0)
Console.WriteLine(stopwatch.ElapsedMilliseconds / 1000);
}
Console.ReadKey();
}
static IEnumerable<string> massiveYieldStatement()
{
yield return "a";
yield return "a";
.. repeat 200,000 times !!
yield return "a";
}
Но это не так!Он находится там без вывода в течение от 4 до 21 минуты, а затем быстро завершается - менее 60 мс в одном случае!В эти минуты используется 100% ЦП одного ядра, а использование памяти растет.В реальном сценарии, где я столкнулся с этим, исключение Stackoverflow
выдается еще до того, как произойдет первая итерация!Я пробовал это в режиме отладки в Visual Studio и в режиме выпуска из командной строки.Я пробовал это на Windows 7 x64 и Windows Server 2008 R2 x64.
Может кто-нибудь объяснить, что здесь происходит?Это для вас воспроизводится?
ПРИМЕЧАНИЕ. Это не настоящий код: в реальном коде гораздо меньше операторов yield, но он намного сложнее.Это просто самое простое воспроизведение.