Mam kilka właściwości, na których mam zamiar używać blokad odczytu / zapisu. Mogę je zaimplementować za pomocą klauzuli try finallylub usingklauzuli.
W przypadku try finallyzdobycia blokady przed tryi zwolnienia w finally. W usingklauzuli utworzyłbym klasę, która uzyskuje blokadę w swoim konstruktorze i zwalnia w swojej metodzie Dispose.
Używam blokad odczytu / zapisu w wielu miejscach, więc szukałem sposobów, które mogą być bardziej zwięzłe niż try finally. Interesuje mnie kilka pomysłów, dlaczego jeden sposób może nie być zalecany lub dlaczego jeden może być lepszy od drugiego.
Metoda 1 ( try finally):
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
rwlMyLock_m .AcquireReaderLock(0);
try
{
return dtMyDateTime_m
}
finally
{
rwlMyLock_m .ReleaseReaderLock();
}
}
set
{
rwlMyLock_m .AcquireWriterLock(0);
try
{
dtMyDateTime_m = value;
}
finally
{
rwlMyLock_m .ReleaseWriterLock();
}
}
}
Metoda 2:
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
using (new ReadLock(rwlMyLock_m))
{
return dtMyDateTime_m;
}
}
set
{
using (new WriteLock(rwlMyLock_m))
{
dtMyDateTime_m = value;
}
}
}
public class ReadLock : IDisposable
{
private ReaderWriterLock rwl;
public ReadLock(ReaderWriterLock rwl)
{
this.rwl = rwl;
rwl.AcquireReaderLock(0);
}
public void Dispose()
{
rwl.ReleaseReaderLock();
}
}
public class WriteLock : IDisposable
{
private ReaderWriterLock rwl;
public WriteLock(ReaderWriterLock rwl)
{
this.rwl = rwl;
rwl.AcquireWriterLock(0);
}
public void Dispose()
{
rwl.ReleaseWriterLock();
}
}