Tho*_*kow 0 c# using-statement readerwriterlockslim
在FileWriter将由不同线程使用的类中,我当前使用a ReaderWriterLockSlim来防止当两个线程同时尝试写入文件时发生的错误,如下所示:
(1)
public class FileWriter
{
private ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();
public void WriteToFile(string message)
{
try
{
this.readerWriterLock.EnterWriteLock();
// the writing happens here
}
finally
{
this.readerWriterLockSlim.ExitWriteLock();
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个确实有效.但在那之后,我读了那个ReaderWriterLockSlim工具IDisposable,所以我想知道是否
(2)
public class FileWriter
{
public void WriteToFile(string message)
{
using (ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim())
{
readerWriterLockSlim.EnterWriteLock();
// the writing happens here
readerWriterLockSlim.ExitWriteLock();
}
}
}
Run Code Online (Sandbox Code Playgroud)
将是"更好"的方法,是否会引入一些新的缺点.我的直觉告诉我,每次调用该方法时我可能不应该创建一个新的ReaderWriterLockSlim,而只是一次(2).
可悲的是,它不起作用(好像我甚至没有使用锁),所以我认为这(2)是不正确的.但话又说回来,为什么要ReaderWriterLockSlim实施,IDisposable如果没有计划用作(2)?
什么是正确的用法ReaderWriterLockSlim?
不是每个IDisposable都直接用于using声明中.另一种模式是,如果你的IDisposable一个类字段中有一个(并且你的类"拥有"该对象1),那么你的类也应该实现IDisposable并清理它的一次性用品Dispose.
你的重写错误是正确的,因为每个调用者都使用不同的锁定对象,因此不会发生排除.
请参阅处理模式:
在包含一次性类型实例的类型上实现Basic Dispose Pattern.有关基本模式的详细信息,请参见" 基本配置模式"部分.
1感谢Dirk对重要警告的评论.如果您处于不试图控制对象生命周期的情况,则不适合Dispose此类对象