考虑以下扩展:
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# 编码新手,无法找到有关这些主题的足够信息来指导我。对于我的问题:我正在考虑在我们的生产代码中使用这个概念,这是一个坏主意吗?会出现什么问题?
最佳答案
这对我来说似乎很好,只是代码看起来很麻烦
我可能会将 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
类似地,您可以实现 UpgradeableReadLock
类来实现 IDisposable
接口(interface)。
这个想法是,您可以在 using
构造中创建一次性类的实例,这确保在构造函数中通过调用 EnterWriteLock()
方法进入写入锁定,当它超出范围时,会自动调用 Dispose()
方法(由 CLR),该方法会调用 ExitWriteLock()
方法。
请注意,它不会处置 ReaderWriterLockSlim
对象;它将处置 WriteLock
对象,该对象只是一个包装器。 ReaderWriterLockSlim
在用户类中也是如此。
关于c# - 带 Action 的 ReaderWriterLockSlim 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7393640/