Si recuerdo correctamente que cuando usé yield dentro de los bloques using SqlConnection
obtuve excepciones de tiempo de ejecución.Rendimiento de rendimiento dentro de los usos
using (var connection = new SqlConnection(connectionString))
{
var command = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Call Read before accessing data.
while (reader.Read())
{
yield reader[0];
}
// Call Close when done reading.
reader.Close();
}
Esos problemas se resolvieron cuando reemplacé yield
por una lista en la que los elementos añadidos cada iteración.
El mismo problema no ocurrió sin embargo a mí cuando dentro using StreamReader
bloques
using (var streamReader = new StreamReader(fileName))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
yield return line;
}
}
¿Hay alguna explicación de por qué excepciones ocurrieron en el primer caso y no en el segundo? ¿Es aconsejable esta construcción?
EDITAR para obtener el error (la eliminación temprana) que hice en el pasado, usted debe llamar el primer método a continuación:
IEnumerable<string> Read(string fileName)
{
using (var streamReader = new StreamReader(fileName))
{
return Read(streamReader);
} // Dispose will be executed before ReadLine() because of deffered execution
}
IEnumerable<string> Read(StreamReader streamReader)
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
yield return line;
}
}
El mismo error se puede lograr con otras formas de aplazamiento de la ejecución, tales como System.Linq.Enumerable.Select()
Lo excepción Qué se obtiene a partir del rendimiento de SQL? – rossisdead
Si tiene reflector, eche un vistazo al código producido por ambos ejemplos de código. Debería arrojar luz sobre por qué uno arroja y uno no. –
@rossisdead Como señaló LukeH, una posible excepción es TimeoutException –