首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带操作的ReaderWriterLockSlim扩展

带操作的ReaderWriterLockSlim扩展
EN

Stack Overflow用户
提问于 2011-09-13 04:31:33
回答 2查看 478关注 0票数 2

考虑以下扩展:

代码语言:javascript
复制
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();
        }
    }
}

还要考虑以下示例用法(去掉一些支持代码):

代码语言:javascript
复制
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#编码的新手,我找不到足够的关于这些主题的信息来指导我。对于我的问题:我正在考虑在我们的产品代码中使用这个概念,这是一个坏主意吗?会出什么问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-13 04:41:21

这对我来说似乎很好,只是代码看起来非常繁琐

我可能会将IDisposable实现为:

代码语言:javascript
复制
public class WriteLock : IDisposable
{
   ReaderWriterLockSlim _rwlock;
   public WriteLock(ReaderWriterLockSlim rwlock ) 
   { 
      _rwlock = rwlock;
      _rwlock.EnterWriteLock(); 
   }
   public void Dispose()
   {
      _rwlock.ExitWriteLock(); 
   }
}

用法:

代码语言:javascript
复制
 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将是这样的。

票数 2
EN

Stack Overflow用户

发布于 2011-09-13 05:53:32

是的,这不是一个好主意,这是有技术原因的。如果操作在更新数据时抛出异常,则数据现在处于未知状态,并且很可能处于损坏状态。您的代码无条件地释放编写器锁,这意味着其他线程现在正在访问部分更新的共享状态。这是一个灾难的秘诀。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7393640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档