我正在为Windows Azure中运行的应用程序编写全局错误处理程序/记录器。当应用程序中发生错误时,将执行许多需要自动进行的操作。我需要防止在上一个错误完成之前记录错误。同时,我希望根据需要读取日志。

我最初的想法是使用监视程序/锁定并仅锁定错误写入。这样一来,读取完全不会受到抑制。我想知道ReaderWriterLockSlim是否更合适。我不能说我真正了解一种方法与另一种方法之间的值(value)。

我应该创建一个ReaderWriterLockSlim并执行以下类似操作(将读取内容包装在EnterReadLock中)...

public static void LogError(Exception exception)
{
    _lock.EnterWriteLock();

    ...

    _lock.ExitWriteLock();
}

还是我只做以下操作,只锁定写部分:
public static void LogError(Exception exception)
{
     lock (someStaticLock)
     {
        ...
     }
}

任何想法/建议将不胜感激。

最佳答案

好的,这完全取决于期望资源争用的方式。以下是我根据锁定的对象和锁定的数量做出的简单决定。

ReaderWriterLockSlim是使用自旋锁实现的,因此,如果您拥有较长的锁定资源(在这种情况下为写入文本),则会由于等待线程进行旋转而导致性能下降。也就是说,它在以下情况下非常有用的工具。

  • 如果您有很多锁,并且每个锁的粒度都更细(对于很小的代码段,则使用锁),然后是ReaderWriterLockSlim或(自旋锁)。
  • 如果锁定是细粒度的,则预期的线程或争用数量很高,则自旋锁才有意义。

  • 当您的争用是粗粒度的并且您知道争用或锁定的数量较少时,“锁定”或“监视器”最适合。

    ReaderWriterLockSlim比ReaderWriterLock快至少3-5倍。

    10-04 17:22