Tengo un montón de propiedades en las que voy a usar bloqueos de lectura/escritura. Puedo implementarlos con una cláusula try finally
o using
.'using' declaración vs 'try finally'
En el try finally
adquiriría el candado antes del try
, y lo liberaré en el finally
. En la cláusula using
, crearía una clase que adquiera el bloqueo en su constructor y las libere en su método Dispose.
Estoy usando bloqueos de lectura/escritura en muchos lugares, así que he estado buscando formas que podrían ser más concisas que try finally
. Estoy interesado en escuchar algunas ideas sobre por qué no se puede recomendar una manera, o por qué una podría ser mejor que otra.
Método 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();
}
}
}
Método 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();
}
}
qué es lo mejor para liberar un recurso que no se puede instanciar dentro de la instrucción de uso o que se reutiliza o se pasa como out param? Try/catch !!! – bjan
@bjan bien, ¿por qué estás considerando 'usar' en ese caso? eso no es para lo que 'usar '. – chakrit
es por eso que también menciono 'try/catch' ya que parece la única forma de manejarlo a través del bloque' try/catch/finally'. hope 'using' podría manejar esto también – bjan