c# - 带 Action 的 ReaderWriterLockSlim 扩展

标签 c# multithreading lambda extension-methods

考虑以下扩展:

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/

相关文章:

c# - 在 C# 中使用 ICU 类和方法

java - 同步语句之外的代码语句是线程安全的吗?

java - 具有工作队列场景的 RabbitMQ 中的 channel 空闲

c# - 如何从属性名称创建 Expression<Func<TModel, string>> 表达式

c# - 如何在 C# 中使用 XMLDocument 删除 XML 文件的第一行?

c# - 为什么我们需要 "out"参数?

java - 如何使用 lambda 表达式从 forEach 方法中中断

lambda - grunt uglify 不接受 lambda 或箭头函数

c# - 根据在 C# 中创建的日期搜索文件

java - 如何创建一个监听端口并接受多个客户端的 Java 服务器