使用 (IDisposable) 与 class 字段 - ReaderWriterLockSlim 的正确用法
using (IDisposable) vs. class field - correct usage of ReaderWriterLockSlim
在将被不同线程使用的FileWriter
class中,我目前使用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();
}
}
}
将是 "better" 方法,它是否 可能引入一些新的缺点 。我的直觉告诉我,我可能不应该每次都创建一个新的 ReaderWriterLockSlim
方法被调用,而是像 (2)
.[=24 中那样只创建一次=]
可悲的是,它不起作用(就好像我什至没有使用锁一样)所以我认为 (2)
不正确.
但话又说回来,如果 ReaderWriterLockSlim
不打算像 (2)
中那样使用,为什么要实施 IDisposable
?
ReaderWriterLockSlim
的正确用法是什么?
并非每个 IDisposable
都 直接 在 using
语句中使用。另一种模式是,如果您的 classes 字段 中有一个 IDisposable
(并且您的 class "owns" 对象1), 那么 你的 class 也应该实现 IDisposable
并清理 its Dispose
.
期间的一次性用品
你说重写是错误的是对的,因为每个调用者都使用不同的锁对象所以没有发生排除。
DO implement the Basic Dispose Pattern on types containing instances of disposable types. See the Basic Dispose Pattern section for details on the basic pattern.
1感谢 Dirk 对重要警告的评论。如果您处于不试图控制对象生命周期的情况,则不适合 Dispose
of such objects
在将被不同线程使用的FileWriter
class中,我目前使用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();
}
}
}
将是 "better" 方法,它是否 可能引入一些新的缺点 。我的直觉告诉我,我可能不应该每次都创建一个新的 ReaderWriterLockSlim
方法被调用,而是像 (2)
.[=24 中那样只创建一次=]
可悲的是,它不起作用(就好像我什至没有使用锁一样)所以我认为 (2)
不正确.
但话又说回来,如果 ReaderWriterLockSlim
不打算像 (2)
中那样使用,为什么要实施 IDisposable
?
ReaderWriterLockSlim
的正确用法是什么?
并非每个 IDisposable
都 直接 在 using
语句中使用。另一种模式是,如果您的 classes 字段 中有一个 IDisposable
(并且您的 class "owns" 对象1), 那么 你的 class 也应该实现 IDisposable
并清理 its Dispose
.
你说重写是错误的是对的,因为每个调用者都使用不同的锁对象所以没有发生排除。
DO implement the Basic Dispose Pattern on types containing instances of disposable types. See the Basic Dispose Pattern section for details on the basic pattern.
1感谢 Dirk 对重要警告的评论。如果您处于不试图控制对象生命周期的情况,则不适合 Dispose
of such objects