【问题标题】:Is there an equivalent of the lock{} statement for ReaderWriterLockSlim?是否有相当于 ReaderWriterLockSlim 的 lock{} 语句?
【发布时间】:2010-12-06 18:13:15
【问题描述】:

我喜欢 C# 中 lock(myLock){ /* do stuff */} 的快捷方式。读/写锁是否有等价物? (特别是 ReaderWriterLockSlim。)现在,我使用以下自定义方法,我认为它有效,但有点烦人,因为我必须将我的操作作为匿名函数传递,如果可能的话,我更愿意使用标准锁定机制.

    void bool DoWithWriteLock(ReaderWriterLockSlim RWLock, int TimeOut, Action Fn)
    {
        bool holdingLock = false;
        try
        {
            if (RWLock.TryEnterWriteLock(TimeOut))
            {
                holdingLock = true;
                Fn();
            }
        }
        finally
        {
            if (holdingLock)
            {
                RWLock.ExitWriteLock();
            }
        }
        return holdingLock;
    }

【问题讨论】:

  • try 语句在错误的位置。把它放在 TryEnterWriteLock() 之后。不再需要变量,快捷方式变得毫无意义。

标签: c# .net locking readerwriterlockslim


【解决方案1】:

您不能覆盖lock 关键字的行为。一种常见的技术是劫持using 关键字。

  1. 使DoWithWriteLock 返回IDisposable
  2. TryEnterWriteLock 调用保留在DoWithWriteLock 方法中
  3. 返回实现IDisposable 的对象。在该对象的 Dispose 方法中,调用 ExitWriteLock

最终结果:

// Before
DoWithWriteLock(rwLock,
    delegate
    {
        Do1();
        Do2()
    } );

// After
using (DoWithWriteLock(rwLock))
{
    Do1();
    Do2();
}

【讨论】:

  • 之前可以更好:DoWithWriteLock(rwLock, () => { Do1(); Do2() } );
  • 嗨蒂姆。这在 F# 中会更容易吗?
  • 对于 TryEnterWriteLock 是否有类似的方法可以在超时的情况下执行此操作?
  • @jonnii F#的lock函数本质上是OP原来的DoWithWriteLock,但是使用Monitor.Enter:lock syncRoot (fun () -> do1 |> do2)
  • 在实际实现中,最好返回一个公开实现IDisposable的struct(避免不必要的堆分配和/或装箱);背景见blogs.msdn.com/b/ericgu/archive/2004/03/24/95743.aspx
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 2015-02-06
  • 2017-05-12
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多