考虑以下扩展:
public static class ReaderWriteExt
{
public static void ExecWriteAction(this ReaderWriterLockSlim rwlock, Action action)
{
rwlock.EnterWriteLock();
try
{
action();
}
finally
{
rwlock.ExitWriteLock();
}
}
public static void ExecUpgradeableReadAction(this ReaderWriterLockSlim rwlock, Action action)
{
rwlock.EnterUpgradeableReadLock();
try
{
action();
}
finally
{
rwlock.ExitUpgradeableReadLock();
}
}
}还要考虑以下示例用法(去掉一些支持代码):
private static ReaderWriterLockSlim _rwlock = new ReaderWriterLockSlim();
private static ... _cacheEntries = ....;
public static void RemoveEntry(string name)
{
WeakReference outValue = null;
_rwlock.ExecUpgradeableReadAction(() =>
{
if (_cacheEntries.TryGetValue(name, out outValue))
{
if (!outValue.IsAlive)
{
_rwlock.ExecWriteAction(() => _cacheEntries.Remove(name));
}
}
});
}我是C#编码的新手,我找不到足够的关于这些主题的信息来指导我。对于我的问题:我正在考虑在我们的产品代码中使用这个概念,这是一个坏主意吗?会出什么问题呢?
发布于 2011-09-13 04:41:21
这对我来说似乎很好,只是代码看起来非常繁琐
我可能会将IDisposable实现为:
public class WriteLock : IDisposable
{
ReaderWriterLockSlim _rwlock;
public WriteLock(ReaderWriterLockSlim rwlock )
{
_rwlock = rwlock;
_rwlock.EnterWriteLock();
}
public void Dispose()
{
_rwlock.ExitWriteLock();
}
}用法:
private ReaderWriterLockSlim _rwlock = new ReaderWriterLockSlim();
//...
using (new WriteLock(_rwlock)) //<-- here the constructor calls EnterWriteLock
{
_cacheEntries.Remove(name);
} //<---here Dispose method gets called automatically which calls ExitWriteLock类似地,您可以实现实现IDisposable接口UpgradeableReadLock类。
这个想法是,你可以在using构造中创建一个disposable类的实例,确保你在构造函数中通过调用EnterWriteLock()方法进入写锁,当它超出作用域时,Dispose()方法被自动调用(由CLR调用),后者调用ExitWriteLock()方法。
请注意,它不会销毁ReaderWriterLockSlim对象;它将销毁只是一个包装器的WriteLock对象。在用户类中,ReaderWriterLockSlim将是这样的。
发布于 2011-09-13 05:53:32
是的,这不是一个好主意,这是有技术原因的。如果操作在更新数据时抛出异常,则数据现在处于未知状态,并且很可能处于损坏状态。您的代码无条件地释放编写器锁,这意味着其他线程现在正在访问部分更新的共享状态。这是一个灾难的秘诀。
https://stackoverflow.com/questions/7393640
复制相似问题