##// END OF EJS Templates
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler...
Reworked cancelation handling, if the cancel handler isn't specified the OperationCanceledException will be handled by the error handler Any unhandled OperationCanceledException will cause the promise cancelation

File last commit:

r153:b933ec88446e v2
r187:dd4a3590f9c6 ref20160224
Show More
ComponentContainer.cs
127 lines | 4.0 KiB | text/x-csharp | CSharpLexer
/ Implab / Components / ComponentContainer.cs
cin
component model refactoring
r152 using System;
using System.Collections.Generic;
using System.Linq;
namespace Implab.Components {
/// <summary>
cin
docs
r153 /// Component container, used to store track components in multi-threaded environmment.
cin
component model refactoring
r152 /// </summary>
/// <remarks>Instanses of this class are thread safe.</remarks>
public class ComponentContainer<T> : Disposable, ICollection<T> {
readonly HashSet<T> m_components = new HashSet<T>();
cin
docs
r153 /// <summary>
/// Removes currently stored compoenents from the container and disposes them if possible.
/// </summary>
/// <remarks>
/// A new components may be added before this method completes.
/// </remarks>
cin
component model refactoring
r152 public void Clear() {
T[] removed;
lock (m_components) {
removed = new T[m_components.Count];
m_components.CopyTo(removed);
m_components.Clear();
}
foreach (var item in removed.OfType<IDisposable>())
item.Dispose();
}
cin
docs
r153 /// <summary>
/// Checks whether the specified item in the collection.
/// </summary>
/// <param name="item">The item to check.</param>
cin
component model refactoring
r152 public bool Contains(T item) {
lock (m_components)
return m_components.Contains(item);
}
cin
docs
r153 /// <summary>
/// Copies currently stored components to the specified array.
/// </summary>
/// <param name="array">A destination array for components.</param>
/// <param name="arrayIndex">A starting index in the destination array.</param>
cin
component model refactoring
r152 public void CopyTo(T[] array, int arrayIndex) {
lock (m_components)
m_components.CopyTo(array, arrayIndex);
}
cin
docs
r153 /// <summary>
/// Remove the specified item from the collection.
/// </summary>
/// <param name="item">The item to remove.</param>
cin
component model refactoring
r152 public bool Remove(T item) {
lock (m_components)
return m_components.Remove(item);
}
cin
docs
r153 /// <summary>
/// Gets the count of components in the collection.
/// </summary>
cin
component model refactoring
r152 public int Count {
get {
lock (m_components)
return m_components.Count;
}
}
cin
docs
r153 /// <summary>
/// Gets a value indicating whether this instance is read only.
/// </summary>
/// <remarks>
/// Always false.
/// </remarks>
cin
component model refactoring
r152 public bool IsReadOnly {
get {
return false;
}
}
cin
docs
r153 /// <summary>
/// Gets the enumerator for components in the collection.
/// </summary>
/// <returns>The enumerator.</returns>
cin
component model refactoring
r152 public IEnumerator<T> GetEnumerator() {
T[] items;
lock (m_components) {
items = new T[m_components.Count];
m_components.CopyTo(items);
return (IEnumerator<T>)items.GetEnumerator();
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
cin
docs
r153 /// <summary>
/// Add the specified item to the collection.
/// </summary>
/// <param name="item">The item to add.</param>
/// <remarks>
/// If the collection is alredy disposed, the item isn't added to the collection and disposed if possible.
/// </remarks>
cin
component model refactoring
r152 public void Add(T item) {
Safe.ArgumentNotNull(item, "item");
lock (m_components) {
if (IsDisposed)
Safe.Dispose(item);
else
m_components.Add(item);
}
}
cin
docs
r153 /// <summary>
/// Disposes the components stored in the collection.
/// </summary>
/// <param name="disposing">If set to <c>true</c> the collection is disposing.</param>
cin
component model refactoring
r152 protected override void Dispose(bool disposing) {
base.Dispose(disposing);
Clear();
}
}
}