Enumerator-Entsorgung, wenn Sie Dispose () nicht verwenden, foreach oder manuell aufrufen
Ich benutzeyield return
iterieren überSqlDataReader
Aufzeichnungen 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?