C#创建安全的栈(Stack)存储结构

2019-12-30 14:27:06丽君

    接下来看一下ReaderWriterLockSlim类:


  /// <summary>
 /// 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问。
 /// </summary>
 [__DynamicallyInvokable]
 [HostProtection(SecurityAction.LinkDemand, ExternalThreading = true, Synchronization = true)]
 [HostProtection(SecurityAction.LinkDemand, MayLeakOnAbort = true)]
 public class ReaderWriterLockSlim : IDisposable
 {
  /// <summary>
  /// 使用默认属性值初始化 <see cref="T:System.Threading.ReaderWriterLockSlim"/> 类的新实例。
  /// </summary>
  [__DynamicallyInvokable]
  public ReaderWriterLockSlim();
  /// <summary>
  /// 在指定锁定递归策略的情况下初始化 <see cref="T:System.Threading.ReaderWriterLockSlim"/> 类的新实例。
  /// </summary>
  /// <param name="recursionPolicy">枚举值之一,用于指定锁定递归策略。</param>
  [__DynamicallyInvokable]
  public ReaderWriterLockSlim(LockRecursionPolicy recursionPolicy);
  /// <summary>
  /// 尝试进入读取模式锁定状态。
  /// </summary>
  /// <exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入读取的模式。- 或 -当它已经包含写入锁时,当前线程可能不会获取读的锁定。- 或 -递归数将超出该计数器的容量。此限制是很大的应用程序应永远不会遇到它。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public void EnterReadLock();
  /// <summary>
  /// 尝试进入读取模式锁定状态,可以选择超时时间。
  /// </summary>
  /// 
  /// <returns>
  /// 如果调用线程已进入读取模式,则为 true;否则为 false。
  /// </returns>
  /// <param name="timeout">等待的间隔;或为 -1 毫秒,表示无限期等待。</param><exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入该锁。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ArgumentOutOfRangeException">值 <paramref name="timeout"/> 为负数,但它不等于-1 毫秒为单位),这是唯一允许的值为负。- 或 -值 <paramref name="timeout"/> 大于 <see cref="F:System.Int32.MaxValue"/> 毫秒为单位)。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public bool TryEnterReadLock(TimeSpan timeout);
  /// <summary>
  /// 尝试进入读取模式锁定状态,可以选择整数超时时间。
  /// </summary>
  /// 
  /// <returns>
  /// 如果调用线程已进入读取模式,则为 true;否则为 false。
  /// </returns>
  /// <param name="millisecondsTimeout">等待的毫秒数,或为 -1 (<see cref="F:System.Threading.Timeout.Infinite"/>),表示无限期等待。</param><exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入该锁。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ArgumentOutOfRangeException">值 <paramref name="millisecondsTimeout"/> 为负数,但它不是等于 <see cref="F:System.Threading.Timeout.Infinite"/> (-1),这是唯一允许的值为负。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public bool TryEnterReadLock(int millisecondsTimeout);
  /// <summary>
  /// 尝试进入写入模式锁定状态。
  /// </summary>
  /// <exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已在任何模式下进入该锁。- 或 -当前线程已进入读取的模式,因此尝试进入锁定状态写模式,则会创建导致死锁的可能性。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public void EnterWriteLock();
  /// <summary>
  /// 尝试进入写入模式锁定状态,可以选择超时时间。
  /// </summary>
  /// 
  /// <returns>
  /// 如果调用线程已进入写入模式,则为 true;否则为 false。
  /// </returns>
  /// <param name="timeout">等待的间隔;或为 -1 毫秒,表示无限期等待。</param><exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入该锁。- 或 -当前线程最初在读取模式中,输入该锁,因此尝试进入写入模式会创建导致死锁的可能性。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ArgumentOutOfRangeException">值 <paramref name="timeout"/> 为负数,但它不等于-1 毫秒为单位),这是唯一允许的值为负。- 或 -值 <paramref name="timeout"/> 大于 <see cref="F:System.Int32.MaxValue"/> 毫秒为单位)。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public bool TryEnterWriteLock(TimeSpan timeout);
  /// <summary>
  /// 尝试进入写入模式锁定状态,可以选择超时时间。
  /// </summary>
  /// 
  /// <returns>
  /// 如果调用线程已进入写入模式,则为 true;否则为 false。
  /// </returns>
  /// <param name="millisecondsTimeout">等待的毫秒数,或为 -1 (<see cref="F:System.Threading.Timeout.Infinite"/>),表示无限期等待。</param><exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入该锁。- 或 -当前线程最初在读取模式中,输入该锁,因此尝试进入写入模式会创建导致死锁的可能性。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ArgumentOutOfRangeException">值 <paramref name="millisecondsTimeout"/> 为负数,但它不是等于 <see cref="F:System.Threading.Timeout.Infinite"/> (-1),这是唯一允许的值为负。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public bool TryEnterWriteLock(int millisecondsTimeout);
  /// <summary>
  /// 尝试进入可升级模式锁定状态。
  /// </summary>
  /// <exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已在任何模式下进入该锁。- 或 -当前线程已进入读取的模式,因此尝试进入可升级模式将有死锁的可能性。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public void EnterUpgradeableReadLock();
  /// <summary>
  /// 尝试进入可升级模式锁定状态,可以选择超时时间。
  /// </summary>
  /// 
  /// <returns>
  /// 如果调用线程已进入可升级模式,则为 true;否则为 false。
  /// </returns>
  /// <param name="timeout">等待的间隔;或为 -1 毫秒,表示无限期等待。</param><exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入该锁。- 或 -当前线程最初在读取模式中,输入该锁,因此尝试进入可升级模式会创建导致死锁的可能性。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ArgumentOutOfRangeException">值 <paramref name="timeout"/> 为负数,但它不等于-1 毫秒为单位),这是唯一允许的值为负。- 或 -值 <paramref name="timeout"/> 大于 <see cref="F:System.Int32.MaxValue"/> 毫秒为单位)。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public bool TryEnterUpgradeableReadLock(TimeSpan timeout);
  /// <summary>
  /// 尝试进入可升级模式锁定状态,可以选择超时时间。
  /// </summary>
  /// 
  /// <returns>
  /// 如果调用线程已进入可升级模式,则为 true;否则为 false。
  /// </returns>
  /// <param name="millisecondsTimeout">等待的毫秒数,或为 -1 (<see cref="F:System.Threading.Timeout.Infinite"/>),表示无限期等待。</param><exception cref="T:System.Threading.LockRecursionException"><see cref="P:System.Threading.ReaderWriterLockSlim.RecursionPolicy"/> 属性是 <see cref="F:System.Threading.LockRecursionPolicy.NoRecursion"/> 和当前的线程已进入该锁。- 或 -当前线程最初在读取模式中,输入该锁,因此尝试进入可升级模式会创建导致死锁的可能性。- 或 -递归数将超出该计数器的容量。限制为应用程序应永远不会遇到它太大。</exception><exception cref="T:System.ArgumentOutOfRangeException">值 <paramref name="millisecondsTimeout"/> 为负数,但它不是等于 <see cref="F:System.Threading.Timeout.Infinite"/> (-1),这是唯一允许的值为负。</exception><exception cref="T:System.ObjectDisposedException"><see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象已被释放。</exception>
  [__DynamicallyInvokable]
  public bool TryEnterUpgradeableReadLock(int millisecondsTimeout);
  /// <summary>
  /// 减少读取模式的递归计数,并在生成的计数为 0(零)时退出读取模式。
  /// </summary>
  /// <exception cref="T:System.Threading.SynchronizationLockException">在读取模式中,当前线程不已进入该锁。</exception>
  [__DynamicallyInvokable]
  public void ExitReadLock();
  /// <summary>
  /// 减少写入模式的递归计数,并在生成的计数为 0(零)时退出写入模式。
  /// </summary>
  /// <exception cref="T:System.Threading.SynchronizationLockException">当前线程不已进入写入模式的锁定。</exception>
  [__DynamicallyInvokable]
  public void ExitWriteLock();
  /// <summary>
  /// 减少可升级模式的递归计数,并在生成的计数为 0(零)时退出可升级模式。
  /// </summary>
  /// <exception cref="T:System.Threading.SynchronizationLockException">当前线程不已进入可升级模式的锁定。</exception>
  [__DynamicallyInvokable]
  public void ExitUpgradeableReadLock();
  /// <summary>
  /// 释放 <see cref="T:System.Threading.ReaderWriterLockSlim"/> 类的当前实例所使用的所有资源。
  /// </summary>
  /// <exception cref="T:System.Threading.SynchronizationLockException"><see cref="P:System.Threading.ReaderWriterLockSlim.WaitingReadCount"/> 是大于零。- 或 -<see cref="P:System.Threading.ReaderWriterLockSlim.WaitingUpgradeCount"/> 是大于零。- 或 -<see cref="P:System.Threading.ReaderWriterLockSlim.WaitingWriteCount"/> 是大于零。</exception><filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public void Dispose();
  /// <summary>
  /// 获取一个值,该值指示当前线程是否已进入读取模式的锁定状态。
  /// </summary>
  /// 
  /// <returns>
  /// 如果当前线程已进入读取模式,则为 true;否则为 false。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public bool IsReadLockHeld { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取一个值,该值指示当前线程是否已进入可升级模式的锁定状态。
  /// </summary>
  /// 
  /// <returns>
  /// 如果当前线程已进入可升级模式,则为 true;否则为 false。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public bool IsUpgradeableReadLockHeld { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取一个值,该值指示当前线程是否已进入写入模式的锁定状态。
  /// </summary>
  /// 
  /// <returns>
  /// 如果当前线程已进入写入模式,则为 true;否则为 false。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public bool IsWriteLockHeld { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取一个值,该值指示当前 <see cref="T:System.Threading.ReaderWriterLockSlim"/> 对象的递归策略。
  /// </summary>
  /// 
  /// <returns>
  /// 枚举值之一,用于指定锁定递归策略。
  /// </returns>
  [__DynamicallyInvokable]
  public LockRecursionPolicy RecursionPolicy { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取已进入读取模式锁定状态的独有线程的总数。
  /// </summary>
  /// 
  /// <returns>
  /// 已进入读取模式锁定状态的独有线程的数量。
  /// </returns>
  [__DynamicallyInvokable]
  public int CurrentReadCount { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取当前线程进入读取模式锁定状态的次数,用于指示递归。
  /// </summary>
  /// 
  /// <returns>
  /// 如果当前线程未进入读取模式,则为 0(零);如果线程已进入读取模式但却不是以递归方式进入的,则为 1;或者如果线程已经以递归方式进入锁定模式 n - 1 次,则为 n。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public int RecursiveReadCount { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取当前线程进入可升级模式锁定状态的次数,用于指示递归。
  /// </summary>
  /// 
  /// <returns>
  /// 如果当前线程没有进入可升级模式,则为 0;如果线程已进入可升级模式却不是以递归方式进入的,则为 1;或者如果线程已经以递归方式进入可升级模式 n - 1 次,则为 n。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public int RecursiveUpgradeCount { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取当前线程进入写入模式锁定状态的次数,用于指示递归。
  /// </summary>
  /// 
  /// <returns>
  /// 如果当前线程没有进入写入模式,则为 0;如果线程已进入写入模式却不是以递归方式进入的,则为 1;或者如果线程已经以递归方式进入写入模式 n - 1 次,则为 n。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public int RecursiveWriteCount { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取等待进入读取模式锁定状态的线程总数。
  /// </summary>
  /// 
  /// <returns>
  /// 等待进入读取模式的线程总数。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public int WaitingReadCount { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取等待进入可升级模式锁定状态的线程总数。
  /// </summary>
  /// 
  /// <returns>
  /// 等待进入可升级模式的线程总数。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public int WaitingUpgradeCount { [__DynamicallyInvokable] get; }
  /// <summary>
  /// 获取等待进入写入模式锁定状态的线程总数。
  /// </summary>
  /// 
  /// <returns>
  /// 等待进入写入模式的线程总数。
  /// </returns>
  /// <filterpriority>2</filterpriority>
  [__DynamicallyInvokable]
  public int WaitingWriteCount { [__DynamicallyInvokable] get; }
 }