que tienen el siguiente método:¿El C# Yield libera un bloqueo?
public static IEnumerable<Dictionary<string, object>> GetRowsIter
(this SqlCeResultSet resultSet)
{
// Make sure we don't multi thread the database.
lock (Database)
{
if (resultSet.HasRows)
{
resultSet.Read();
do
{
var resultList = new Dictionary<string, object>();
for (int i = 0; i < resultSet.FieldCount; i++)
{
var value = resultSet.GetValue(i);
resultList.Add(resultSet.GetName(i), value == DBNull.Value
? null : value);
}
yield return resultList;
} while (resultSet.Read());
}
yield break;
}
acabo añade el lock(Database)
para tratar de deshacerse de algunas cuestiones concurancy. Sin embargo, tengo curiosidad, ¿el yield return
liberará el bloqueo en Database
y luego volverá a bloquearse cuando sea necesario para la próxima iteración? ¿O Database
permanecerá bloqueado durante toda la iteración?
Consulte "Y' finalmente' ... "en http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx –
Esta es una idea potencialmente * extremadamente mala *. Es muy difícil controlar el orden de bloqueo cuando puede ejecutar código arbitrario entre cuando se obtiene el bloqueo y se libera el bloqueo. Esto es solo pedir puntos muertos. –
@Eric Lippert - No estoy muy familiarizado con la codificación multiproceso. (Aunque estoy mejorando a medida que avanzo). Ahora sé que la "magia" de la instrucción lock es en realidad solo un bloque 'try finally' y que' yield' mantiene las cosas en el alcance mientras está en un estado cedido. Con esto en mente, moví la cerradura para rodear solo el ciclo 'for'. Eso me da la restricción en el acceso de SQL Server CE que necesito sin bloquear durante el tiempo de iteración "off". (Al menos así lo espero!) – Vaccano