代码之家  ›  专栏  ›  技术社区  ›  Thomas Flinkow

使用(idisposable)与类字段-正确使用readerwriterlockslim

  •  0
  • Thomas Flinkow  · 技术社区  · 8 年前

    在一个 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();
            }
        }
    }
    

    哪一个 做功 . 但在那之后,我读到了 读写锁操作 器具 IDisposable ,所以我想知道

    (2)
    
    public class FileWriter
    {
        public void WriteToFile(string message)
        {
            using (ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim())
            {
                readerWriterLockSlim.EnterWriteLock();
                // the writing happens here
                readerWriterLockSlim.ExitWriteLock();
            }
        }
    }
    

    会是“更好”的方法 可能会带来一些新的缺点 . 我的直觉告诉我 我可能不应该创造一个新的 读写锁操作 每一次 方法只调用一次,如 (2) .

    但不幸的是, 它不起作用 (好像我根本没用过锁)所以我想 (2) 不可能是正确的。 但再说一遍,为什么 读写锁操作 实施 不可分的 如果不是计划用的话 (2) ?


    什么是正确的用法 读写锁操作 ?

    1 回复  |  直到 8 年前
        1
  •  7
  •   Damien_The_Unbeliever    8 年前

    不是每一个 IDisposable 直接地 用于 using 语句。另一种模式是如果你有一个 不可分的 在你的一个班里 领域 (而你的类“拥有”那个对象 ) 你班 也应该实施 不可分的 清理 它的 期间的一次性用品 Dispose .

    你是对的,你的重写是错的,因为 每个调用方都在使用不同的锁对象 所以没有排斥发生。

    Dispose Pattern :

    对包含可弃类型实例的类型实现基本的dispose模式。见 Basic Dispose Pattern 有关基本模式的详细信息。


    多亏了 Dirk 对重要警告的评论。如果你不想控制一个对象的生命周期,那么 处置 这些物体的

    推荐文章