Enumerator-Entsorgung, wenn Sie Dispose () nicht verwenden, foreach oder manuell aufrufen

Ich benutzeyield return iterieren überSqlDataReaderAufzeichnungen von:

IEnumerable<Reading> GetReadings() {
    using (var connection = new SqlConnection(_connectionString))
    {
        using (var command = new SqlCommand(_query, connection))
        {
            connection.Open();
            using (var reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new Reading
                    {
                        End = reader.GetDateTime(0),
                        Value = reader.GetDouble(1)
                    };
                }
            }
            connection.Close();
        }
    }
}

Ich benutze dann eine angepasste Version vondiese akzeptierte Antwort um mehrere Iteratoren zu "zipen":

   var enumerators = data.Select(d => new
   {
       d.Key,
       Enumerator = d.Value.GetEnumerator()
   }).ToList();

   while (true)
   {
       foreach (var item in enumerators)
       {
           if (!item.Enumerator.MoveNext())
           {
               yield break;
           }

           /*snip*/
       }

      /*snip*/
   }

In der obigen Methode der EnumeratorDispose() wird nicht explizit aufgerufen, und weil sie nicht innerhalb einesusing oderforeach Aussage, würde der zugrunde liegende Iterator in einem offenen Zustand bleiben? In meinem Fall mit einem offenenSqlConnection.

Soll ich anrufenDispose() über die Enumeratoren, um sicherzustellen, dass die gesamte nachgelagerte Kette geschlossen ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage