lock
verwendet dieses MusterLocking mit Timeout Muster
if(Monitor.Enter(lock))
try
{
...
}
finally { Monitor.Exit(lock); } // using this style to reduce post "height"
, wenn wir nicht unendlich warten möchten wir Timeout
if(!Monitor.TryEnter(lock, timeout))
throw new TimeoutException();
try
{
...
}
finally { Monitor.Exit(lock); }
Ich habe Szenario liefern, wenn Verfahren, bevor es mehrere Schlösser erhalten hat fang an, irgendetwas zu tun. Das sieht schrecklich:
if(!Monitor.TryEnter(lockA, timeout))
throw new TimeoutException();
try
{
if(!Monitor.TryEnter(lockB, timeout))
throw new TimeoutException();
try
{
if(!Monitor.TryEnter(lockC, timeout))
throw new TimeoutException();
try
{
... // more of such constructions
}
finally { Monitor.Exit(lockC); }
}
finally { Monitor.Exit(lockB); }
}
finally { Monitor.Exit(lockA); }
Es hat Probleme:
hässlich aussieht (der Code-Methode ist gegliederte, sich vorstellen, wie es aussieht für
lockZ
) können, indem sie Methodencode in ein anderes Verfahren gelöst werden .Die Synchronisierung erfolgt synchron, so dass der schlimmste erfolgreiche Fall etwas länger dauern kann als eine Summe aller Timeouts.
Gibt es eine Möglichkeit, dieses Timeout-Muster zu verbessern?
Ich dachte, ein Verfahren mit Delegat Parameter und sperren, um so etwas wie Linq Verkettungs zu erreichen (aber auch Schlösser parallel laufen, ist dies eine Herausforderung):
Lock(lockA).Lock(lockB).Lock(lockC).Run(() => ...);
Oder vielleicht gibt es einen anderen Weg, ?
Sperren in ctor ist definitiv ein gut verbreitetes Muster, vor allem in C++. Es heißt RAII. –