1 //---------------------------------------------------------------------
2 // <copyright file="ThreadSafeList.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
10 using System.Collections.Generic;
11 using System.Threading;
12 namespace System.Data.Common.Utils
15 internal sealed class ThreadSafeList<T> : IList<T>
17 private readonly ReaderWriterLockSlim _lock;
18 private List<T> _list;
20 internal ThreadSafeList()
22 _list = new List<T>();
23 _lock = new ReaderWriterLockSlim();
30 _lock.EnterReadLock();
45 public void Add(T item)
47 _lock.EnterWriteLock();
54 _lock.ExitWriteLock();
58 public T this[int index]
62 _lock.EnterReadLock();
66 result = _list[index];
76 _lock.EnterWriteLock();
83 _lock.ExitWriteLock();
88 public bool IsReadOnly
96 public int IndexOf(T item)
98 _lock.EnterReadLock();
102 result = _list.IndexOf(item);
106 _lock.ExitReadLock();
111 public void Insert(int index, T item)
113 _lock.EnterWriteLock();
116 _list.Insert(index, item);
120 _lock.ExitWriteLock();
124 public void RemoveAt(int index)
126 _lock.EnterWriteLock();
129 _list.RemoveAt(index);
133 _lock.ExitWriteLock();
139 _lock.EnterWriteLock();
146 _lock.ExitWriteLock();
150 public bool Contains(T item)
152 _lock.EnterReadLock();
156 result = _list.Contains(item);
160 _lock.ExitReadLock();
165 public void CopyTo(T[] array, int arrayIndex)
167 _lock.EnterWriteLock();
170 _list.CopyTo(array, arrayIndex);
174 _lock.ExitWriteLock();
178 public bool Remove(T item)
180 _lock.EnterWriteLock();
184 result = _list.Remove(item);
188 _lock.ExitWriteLock();
193 public IEnumerator<T> GetEnumerator()
195 _lock.EnterReadLock();
198 foreach (T value in _list)
205 _lock.ExitReadLock();
209 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
211 return this.GetEnumerator();