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

ReaderWriterLockSlim的扩展方法
EN

Code Review用户
提问于 2012-11-22 10:45:41
回答 1查看 416关注 0票数 4

在当前的项目中,我使用了大量的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>(...)方法的代码。所有的方法看起来都很相似。

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

回答 1

Code Review用户

发布于 2012-12-14 17:34:13

看起来挺不错的。我看不出比这更好的东西。

我只想把它加到你的代码中:

代码语言:javascript
复制
    private static void Critical(Action criticalAction)
    {
        try
        {
            Thread.BeginCriticalRegion();
            criticalAction();
        }
        finally
        {
            Thread.EndCriticalRegion();
        }
    }

在退出锁之前,我使用了IsWriteLockHeldIsReadLockHeld等。

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

https://codereview.stackexchange.com/questions/18908

复制
相关文章

相似问题

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