ConcurrentList.cs 1013 B

123456789101112131415161718192021222324252627
  1. namespace MeloongCore;
  2. /// <summary>
  3. /// 线程安全的 <see cref="List{T}"/> 实现。
  4. /// 在 <see cref="SynchronizedCollection{T}"/> 的基础上,当调用枚举器时返回一个临时副本,以避免列表在枚举过程中被修改导致异常。
  5. /// </summary>
  6. public class ConcurrentList<T> : SynchronizedCollection<T>, IEnumerable, IEnumerable<T> {
  7. // 构造函数
  8. public ConcurrentList() : base() { }
  9. public ConcurrentList(IEnumerable<T> data) : base(new object(), data) { }
  10. public static implicit operator ConcurrentList<T>(List<T> data) => new(data);
  11. public static implicit operator List<T>(ConcurrentList<T> data) => new(data);
  12. // 对枚举器进行覆写,返回一个临时副本
  13. public new IEnumerator<T> GetEnumerator() {
  14. lock (SyncRoot) {
  15. return Items.ToList().GetEnumerator();
  16. }
  17. }
  18. IEnumerator IEnumerable.GetEnumerator() {
  19. lock (SyncRoot) {
  20. return Items.ToList().GetEnumerator();
  21. }
  22. }
  23. }