c# - 如何重构这些锁?

标签 c# .net inheritance concurrency locking

将锁移动到 Parent 类的天真的解决方案具有不同的行为:我将无法调用 new Child1().Method1()new Child2().Method1() 同时进行。

有什么方法可以重构下面的代码吗?

abstract class Parent
{
    protected abstract Method1();
}

class Child1 : Parent
{
    static object staticLock = new object();

    public void Method1()
    {
        lock(staticLock)
        {
          // Do something ...
        }
    }
}

class Child2 : Parent
{
    static object staticLock = new object();

    public void Method1()
    {
        lock(staticLock)
        {
          // Do something else ...
        }
    }
}

我问这个是因为它不仅仅是 2 个子类,所以真正的问题更大。

最佳答案

让每个提供锁定策略的子类实现一个方法,并将 Method1 移动到基类,如您的 other问题。

class Parent
{
  public void Method1()
  {
    using(acquireLock())
    {
      Method1Impl();
    }
  }
  protected abstract IDisposable acquireLock();
  protected abstract void Method1Impl();
}
class Child : Parent
{
   protected override IDisposable acquireLock()
   {
      // return some class that does appropriate locking 
      // and in Dispose releases the lock.
      // may even be no-op locking.
   }
}

关于c# - 如何重构这些锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9198604/

相关文章:

c# - 特定于环境的 StructureMap 配置?

c++ - 在派生模板类中看不到来自基模板类的指针

c# - 如何在继承中授予对选择性类方法的访问权限?

C# Timespan 毫秒与 TotalMilliseconds

c# - 你可以使用 C# 或 JS/Ajax 跨站点 ping 另一个站点吗?

c# - 在按钮集合中创建、使用和比较元素

c# - 属性构造函数的默认值?

c# - 为什么不能从 C# 中的值类型派生?

c# - 如何使用 C# 和 LINQ 深入提取 XML 中的信息?

javascript - javascript对象继承如何工作?