Ich habe eine Reihe von Eigenschaften, die ich Lese-/Schreib-Sperren verwenden werde. Ich kann sie entweder mit einer try finally
oder einer using
Klausel implementieren.'using' statement vs 'try finally'
In der try finally
würde ich das Schloss vor der try
erwerben und in der finally
freigeben. In der using
-Klausel würde ich eine Klasse erstellen, die die Sperre in ihrem Konstruktor erwirbt und in ihrer Dispose-Methode freigibt.
Ich benutze Lese/Schreib-Sperren an vielen Orten, so habe ich nach Wegen gesucht, die prägnanter sein könnten als try finally
. Ich bin daran interessiert, einige Ideen zu hören, warum ein Weg möglicherweise nicht empfohlen wird, oder warum einer besser sein könnte als ein anderer.
Methode 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();
}
}
}
Methode 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();
}
}
was ist am besten, um eine Ressource freizugeben, die nicht instanziiert werden kann, indem man statement verwendet oder wiederverwendet wird oder als out param übergeben wird? Try/catch !!! – bjan
@bjan nun, warum denkst du überhaupt über 'using' in diesem Fall? Das ist nicht das, wofür 'using' verwendet wird. – chakrit
Deshalb erwähne ich auch "try/catch", da es die einzige Möglichkeit ist, über 'try/catch/finally' zu blocken. hoffte 'using' konnte das auch handhaben – bjan