DisposableConcurrentDictionary.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Masuit.Tools.Systems;
  5. /// <summary>
  6. /// 值可被Dispose的字典类型
  7. /// </summary>
  8. /// <typeparam name="TKey"></typeparam>
  9. /// <typeparam name="TValue"></typeparam>
  10. public class DisposableConcurrentDictionary<TKey, TValue> : NullableConcurrentDictionary<TKey, TValue>, IDisposable where TValue : IDisposable
  11. {
  12. private bool _isDisposed;
  13. /// <summary>
  14. /// 终结器
  15. /// </summary>
  16. ~DisposableConcurrentDictionary()
  17. {
  18. Dispose(false);
  19. }
  20. public DisposableConcurrentDictionary() : base()
  21. {
  22. }
  23. public DisposableConcurrentDictionary(TValue fallbackValue) : base()
  24. {
  25. FallbackValue = fallbackValue;
  26. }
  27. public DisposableConcurrentDictionary(int concurrencyLevel, int capacity) : base(concurrencyLevel, capacity)
  28. {
  29. }
  30. public DisposableConcurrentDictionary(IEqualityComparer<NullObject<TKey>> comparer) : base(comparer)
  31. {
  32. }
  33. /// <summary>
  34. ///
  35. /// </summary>
  36. public void Dispose()
  37. {
  38. if (_isDisposed)
  39. {
  40. return;
  41. }
  42. Dispose(true);
  43. _isDisposed = true;
  44. GC.SuppressFinalize(this);
  45. }
  46. /// <summary>
  47. /// 释放
  48. /// </summary>
  49. /// <param name="disposing"></param>
  50. public void Dispose(bool disposing)
  51. {
  52. foreach (var s in Values.Where(v => v != null))
  53. {
  54. s.Dispose();
  55. }
  56. }
  57. }