在当前的项目中,我使用了大量的ReaderWriterLockSlim来同步读写值。在我看来,每次需要访问值时处理try { EnterReadLock(); .... } finaly { ExitReadLock(); }似乎都是在复制代码。因此,我为ReaderWriterLockSlim创建了扩展方法,这使我编写代码变得更容易,速度更快(我认为是可重用的)。
但是,我想知道,如果您在扩展方法中发现了一些缺点,我会忽略或忘记。有三种扩展方法:
ReadOnly<T>(this ReaderWriterLockSlim self, Func<T> readFunc) // calls EnterReadLock()Read<T>(this ReaderWriterLockSlim self, Func<T> readFunc) // calls EnterUpgradeableReadLock()Write(this ReaderWriterLockSlim self, Action writeAction) // calls EnterWriteLock()Write<T>(this ReaderWriterLockSlim self, Func<T> writeAction) // calls EnterWriteLock()有ReadOnly<T>(...)方法的代码。所有的方法看起来都很相似。
public static T ReadOnly<T>(this ReaderWriterLockSlim self, Func<T> readFunc) {
if (object.ReferenceEquals(self, null)) { throw new ArgumentNullException("self"); }
if (object.ReferenceEquals(readFunc, null)) { throw new ArgumentNullException("readFunc"); }
T result;
// flag, if lock was entered
bool lockEntered = false;
try {
// I don't want the ThreadAbortException during claiming the lock
Thread.BeginCriticalRegion();
try {
self.EnterReadLock();
lockEntered = true;
}
finally {
Thread.EndCriticalRegion();
}
result = readFunc();
}
finally {
// I don't want the ThreadAbortException during releasing the lock
Thread.BeginCriticalRegion();
try {
if (lockEntered) {
self.ExitReadLock();
}
}
finally {
Thread.EndCriticalRegion();
}
}
return result;
}发布于 2012-12-14 17:34:13
看起来挺不错的。我看不出比这更好的东西。
我只想把它加到你的代码中:
private static void Critical(Action criticalAction)
{
try
{
Thread.BeginCriticalRegion();
criticalAction();
}
finally
{
Thread.EndCriticalRegion();
}
}在退出锁之前,我使用了IsWriteLockHeld、IsReadLockHeld等。
https://codereview.stackexchange.com/questions/18908
复制相似问题