在将由不同线程使用的FileWriter
类中,我当前使用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();
}
}
}
可以正常工作。但在那之后,我读到ReaderWriterLockSlim
实现了IDisposable
,所以我想知道是否
(2)
public class FileWriter
{
public void WriteToFile(string message)
{
using (ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim())
{
readerWriterLockSlim.EnterWriteLock();
// the writing happens here
readerWriterLockSlim.ExitWriteLock();
}
}
}
将是"更好"方法以及是否会引入一些新的缺点。我的直觉告诉我我可能不应该每次创建一个新的ReaderWriterLockSlim
方法,而只需要调用(2)
一次。
可悲的是,它不起作用(好像我还没有使用过锁)所以我认为(2)
可以'是对的。
但是,如果没有计划在ReaderWriterLockSlim
中使用,为什么会IDisposable
实施(2)
?
ReaderWriterLockSlim
的正确用法是什么?
答案 0 :(得分:7)
IDisposable
语句中并非每个using
都直接使用。另一种模式是,如果您的某个类字段中有IDisposable
(并且您的类"拥有"该对象 1 ),那么你的班级也应该在IDisposable
期间实施Dispose
并清理 一次性用品。
您确认重写是错误的,因为每个来电者都使用不同的锁定对象,因此不会发生任何排除。
请参阅Dispose Pattern:
在包含一次性类型实例的类型上实现Basic Dispose Pattern。有关基本模式的详细信息,请参阅Basic Dispose Pattern部分。
1 感谢Dirk对重要警告的评论。如果您处于不试图控制对象生命周期的情况,那么Dispose
这类对象不适合