Mam następujący sposób:Czy C# wydajność odblokowuje blokadę?
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;
}
Właśnie dodałem do lock(Database)
aby spróbować pozbyć się niektórych kwestiach concurancy. Ciekaw jestem jednak, czy yield return
zwolni blokadę na Database
, a następnie ponownie ją zablokuje, gdy przejdzie do następnej iteracji? Czy też Database
pozostanie zablokowane przez cały czas trwania iteracji?
Zobacz "I" wreszcie "..." w http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx –
Jest to potencjalnie * wyjątkowo zły pomysł *. Bardzo trudno jest kontrolować porządkowanie zamków, gdy można uruchomić dowolny kod między momentem uzyskania blokady a zwolnieniem blokady. To tylko pytanie o zakleszczenia. –
@Eric Lippert - Nie jestem zbyt zaznajomiony z kodowaniem wielowątkowym. (Chociaż coraz lepiej mi idzie.) Teraz wiem, że "magia" instrukcji lock jest w rzeczywistości tylko blokiem "try finally", a ta "wydajność" zachowuje rzeczy w zakresie, gdy jest w stanie przyniesionym. Mając to na uwadze, przesunął blokadę, aby otoczyć pętlę 'for'. To daje mi ograniczenie dostępu do SQL Server CE, którego potrzebuję, a nie blokowanie podczas "off" czasu iteracji. (Przynajmniej tak mam nadzieję!) – Vaccano