Mercurial > pub > ImplabNet
view Implab/ComponentContainer.cs @ 117:8beee0d11de6 v2
pool refactoring
author | cin |
---|---|
date | Tue, 23 Dec 2014 19:48:47 +0300 |
parents | da56ba7b1aab |
children | 2573b562e328 |
line wrap: on
line source
using System; using Implab.Parallels; using System.Threading; namespace Implab { public class ComponentContainer : IComponentContainer, IDisposable { static readonly ComponentContainer _appContainer; static ComponentContainer() { _appContainer = new ComponentContainer(); AppDomain.CurrentDomain.ProcessExit += HandleProcessExit; } public static ComponentContainer Global { get { return _appContainer; } } bool m_disposed; readonly MTQueue<IDisposable> m_components = new MTQueue<IDisposable>(); public void Add(IDisposable item) { Safe.ArgumentNotNull(item, "item"); Thread.MemoryBarrier(); if (m_disposed) { item.Dispose(); } else { m_components.Enqueue(item); if (m_disposed && m_components.TryDequeue(out item)) item.Dispose(); } } public void Dispose() { m_disposed = true; IDisposable item; while (m_components.TryDequeue(out item)) item.Dispose(); } static void HandleProcessExit (object sender, EventArgs e) { _appContainer.Dispose(); } } }