andrew4582

ThreadSafeList<T>

Nov 10th, 2011
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.39 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading;
  6.  
  7. namespace Core {
  8.  
  9.     public class ThreadSafeList<T>:IEnumerable<T> where T:class {
  10.  
  11.         readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
  12.         readonly List<T> _innerList;
  13.  
  14.         public ThreadSafeList() {
  15.             _innerList = new List<T>();
  16.         }
  17.         public ThreadSafeList(int capacity) {
  18.             _innerList = new List<T>(capacity);
  19.         }
  20.         public ThreadSafeList(IEnumerable<T> collection) {
  21.             _innerList = new List<T>(collection);
  22.         }
  23.         public void Add(T item) {
  24.             _lock.EnterWriteLock();
  25.             try {
  26.                 _innerList.Add(item);
  27.             }
  28.             finally {
  29.                 _lock.ExitWriteLock();
  30.             }
  31.         }
  32.  
  33.         public void AddRange(IEnumerable<T> collection) {
  34.             _lock.EnterWriteLock();
  35.             try {
  36.                 _innerList.AddRange(collection);
  37.             }
  38.             finally {
  39.                 _lock.ExitWriteLock();
  40.             }
  41.         }
  42.  
  43.         public void Insert(int index,T item) {
  44.             _lock.EnterWriteLock();
  45.             try {
  46.                 _innerList.Insert(index,item);
  47.             }
  48.             finally {
  49.                 _lock.ExitWriteLock();
  50.             }
  51.         }
  52.         public void InsertRange(int index,IEnumerable<T> collection) {
  53.             _lock.EnterWriteLock();
  54.             try {
  55.                 _innerList.InsertRange(index,collection);
  56.             }
  57.             finally {
  58.                 _lock.ExitWriteLock();
  59.             }
  60.         }
  61.  
  62.         public bool Remove(T item) {
  63.             _lock.EnterWriteLock();
  64.             try {
  65.                 return _innerList.Remove(item);
  66.             }
  67.             finally {
  68.                 _lock.ExitWriteLock();
  69.             }
  70.         }
  71.         public void RemoveAt(int index) {
  72.  
  73.             _lock.EnterWriteLock();
  74.             try {
  75.                 _innerList.RemoveAt(index);
  76.             }
  77.             finally {
  78.                 _lock.ExitWriteLock();
  79.             }
  80.         }
  81.  
  82.  
  83.         public int Count {
  84.             get {
  85.                 _lock.EnterReadLock();
  86.                 try {
  87.                     return _innerList.Count;
  88.                 }
  89.                 finally {
  90.                     _lock.ExitReadLock();
  91.                 }
  92.             }
  93.         }
  94.  
  95.         public T this[int index] {
  96.             get {
  97.                 _lock.EnterReadLock();
  98.                 try {
  99.                     return _innerList[index];
  100.                 }
  101.                 finally {
  102.                     _lock.ExitReadLock();
  103.                 }
  104.  
  105.             }
  106.             set {
  107.                 _lock.EnterWriteLock();
  108.                 try {
  109.                     _innerList[index] = value;
  110.                 }
  111.                 finally {
  112.                     _lock.ExitWriteLock();
  113.                 }
  114.             }
  115.         }
  116.         public T GetOrCreate(Predicate<T> predicate,Func<T> creator) {
  117.             _lock.EnterUpgradeableReadLock();
  118.             try {
  119.                 var item = _innerList.FirstOrDefault(pm => predicate(pm));
  120.  
  121.                 if(item == null) {
  122.                     _lock.EnterWriteLock();
  123.                     try {
  124.                         item = creator();
  125.  
  126.                         _innerList.Add(item);
  127.                     }
  128.                     finally {
  129.                         _lock.ExitWriteLock();
  130.                     }
  131.                 }
  132.  
  133.                 return item;
  134.             }
  135.             finally {
  136.                 _lock.ExitUpgradeableReadLock();
  137.             }
  138.  
  139.         }
  140.  
  141.         public void Clear() {
  142.             _lock.EnterWriteLock();
  143.             try {
  144.                 _innerList.Clear();
  145.             }
  146.             finally {
  147.                 _lock.ExitWriteLock();
  148.             }
  149.         }
  150.  
  151.         IEnumerator<T> IEnumerable<T>.GetEnumerator() {
  152.             return GetEnumeratorInternal();
  153.         }
  154.  
  155.         IEnumerator IEnumerable.GetEnumerator() {
  156.             return GetEnumeratorInternal();
  157.         }
  158.  
  159.         IEnumerator<T> GetEnumeratorInternal() {
  160.             _lock.EnterReadLock();
  161.             try {
  162.                 return _innerList.ToList().GetEnumerator();
  163.             }
  164.             finally {
  165.                 _lock.ExitReadLock();
  166.             }
  167.         }
  168.     }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment