我正在为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比ReaderWriterLock快至少3-5倍。