Ho il seguente metodo:Il codice C libera un blocco?
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;
}
Ho appena aggiunto il lock(Database)
per cercare di sbarazzarsi di alcuni problemi concurancy. Sono curioso però, il yield return
libererà il blocco su Database
e quindi si bloccherà di nuovo quando andrà per la successiva iterazione? O lo Database
rimane bloccato per l'intera durata dell'iterazione?
Vedere "And' finally' ... "in http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx –
Questa è un'idea potenzialmente * estremamente pessima *. È molto difficile controllare l'ordine di blocco quando è possibile eseguire codice arbitrario tra quando viene ottenuto il blocco e rilasciato il blocco. Questo è solo chiedere dei deadlock. –
@Eric Lippert - Non ho molta familiarità con la codifica multithread. (Anche se sto migliorando mentre vado.) Ora so che la "magia" dell'istruzione lock è in realtà solo un blocco "try finally'" e che "yield" mantiene le cose nello scope mentre è in uno stato ceduto. Con questo in mente spostato il blocco per circondare solo il ciclo 'for'. Ciò mi dà la restrizione sull'accesso a SQL Server CE di cui ho bisogno mentre non si blocca durante il tempo di iterazione "off". (Almeno così spero!) – Vaccano