繁体   English   中英

使用(IDisposable)vs. class字段-正确使用ReaderWriterLockSlim

[英]using (IDisposable) vs. class field - correct usage of ReaderWriterLockSlim

在将由不同线程使用的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)不能正确。 但是再说一次,如果未计划像在(2)那样使用ReaderWriterLockSlim ,为什么还要实现IDisposable呢?


ReaderWriterLockSlim的正确用法是什么?

并非每个IDisposable都可以直接using语句中using 另一种模式是,如果您在一个类字段中有一个IDisposable (并且您的类“拥有”该对象1 ),那么您的类也应实现IDisposable并在Dispose期间清理可抛弃型。

您是正确的,您的重写是错误的,因为每个调用者都使用不同的锁对象 ,因此不会发生任何排斥。

请参阅处置方式

不要在包含可处理类型实例的类型上实现基本处理模式。 有关基本模式的详细信息,请参见“ 基本处理模式”部分。


1感谢Dirk提出的重要警告。 如果您不想控制对象的生存期,则不适合Dispose此类对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM