using System; using System.Threading; namespace Amib.Threading.Internal { public abstract class WorkItemsGroupBase : IWorkItemsGroup { #region Private Fields /// /// Contains the name of this instance of SmartThreadPool. /// Can be changed by the user. /// private string _name = "WorkItemsGroupBase"; public WorkItemsGroupBase() { IsIdle = true; } #endregion #region IWorkItemsGroup Members #region Public Methods /// /// Get/Set the name of the SmartThreadPool/WorkItemsGroup instance /// public string Name { get { return _name; } set { _name = value; } } #endregion #region Abstract Methods public abstract int Concurrency { get; set; } public abstract int WaitingCallbacks { get; } public abstract object[] GetStates(); public abstract WIGStartInfo WIGStartInfo { get; } public abstract void Start(); public abstract void Cancel(bool abortExecution); public abstract bool WaitForIdle(int millisecondsTimeout); public abstract event WorkItemsGroupIdleHandler OnIdle; internal abstract void Enqueue(WorkItem workItem); internal virtual void PreQueueWorkItem() { } #endregion #region Common Base Methods /// /// Cancel all the work items. /// Same as Cancel(false) /// public virtual void Cancel() { Cancel(false); } /// /// Wait for the SmartThreadPool/WorkItemsGroup to be idle /// public void WaitForIdle() { WaitForIdle(Timeout.Infinite); } /// /// Wait for the SmartThreadPool/WorkItemsGroup to be idle /// public bool WaitForIdle(TimeSpan timeout) { return WaitForIdle((int)timeout.TotalMilliseconds); } /// /// IsIdle is true when there are no work items running or queued. /// public bool IsIdle { get; protected set; } #endregion #region QueueWorkItem public IWorkItemResult QueueWorkItem(WaitCallback callback) { WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, null); Enqueue(workItem); return workItem.GetWorkItemResult(); } public IWorkItemResult QueueWorkItem(WaitCallback callback, object state) { WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state); Enqueue(workItem); return workItem.GetWorkItemResult(); } public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WaitCallback callback) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback, null); Enqueue(workItem); return workItem.GetWorkItemResult(); } public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WaitCallback callback, object state) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback, state); Enqueue(workItem); return workItem.GetWorkItemResult(); } /// /// Queue a work item /// /// A callback to execute /// Returns a work item result public IWorkItemResult QueueWorkItem(WorkItemCallback callback) { WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback); Enqueue(workItem); return workItem.GetWorkItemResult(); } /// /// Queue a work item /// /// Work item info /// A callback to execute /// Returns a work item result public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback); Enqueue(workItem); return workItem.GetWorkItemResult(); } /// /// Queue a work item /// /// A callback to execute /// /// The context object of the work item. Used for passing arguments to the work item. /// /// Returns a work item result public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state) { WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state); Enqueue(workItem); return workItem.GetWorkItemResult(); } /// /// Queue a work item /// /// Work item information /// A callback to execute /// /// The context object of the work item. Used for passing arguments to the work item. /// /// Returns a work item result public IWorkItemResult QueueWorkItem(WorkItemInfo workItemInfo, WorkItemCallback callback, object state) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, workItemInfo, callback, state); Enqueue(workItem); return workItem.GetWorkItemResult(); } /// /// Queue a work item /// /// A callback to execute /// /// The context object of the work item. Used for passing arguments to the work item. /// /// /// A delegate to call after the callback completion /// /// Returns a work item result public IWorkItemResult QueueWorkItem( WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback); Enqueue(workItem); return workItem.GetWorkItemResult(); } /// /// Queue a work item /// /// A callback to execute /// /// The context object of the work item. Used for passing arguments to the work item. /// /// /// A delegate to call after the callback completion /// /// Indicates on which cases to call to the post execute callback /// Returns a work item result public IWorkItemResult QueueWorkItem( WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, CallToPostExecute callToPostExecute) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute); Enqueue(workItem); return workItem.GetWorkItemResult(); } #endregion #region QueueWorkItem(Action<...>) public IWorkItemResult QueueWorkItem (Action action) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, delegate { action.Invoke (); return null; }); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem (Action action, T arg) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem (Action action, T1 arg1, T2 arg2) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg1, arg2); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem (Action action, T1 arg1, T2 arg2, T3 arg3) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg1, arg2, arg3); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem ( Action action, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg1, arg2, arg3, arg4); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3, arg4 } : null); Enqueue (workItem); return workItem.GetWorkItemResult (); } #endregion #region QueueWorkItem(Func<...>) public IWorkItemResult QueueWorkItem(Func func) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem( this, WIGStartInfo, state => { return func.Invoke(); }); Enqueue(workItem); return new WorkItemResultTWrapper(workItem.GetWorkItemResult()); } public IWorkItemResult QueueWorkItem(Func func, T arg) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem( this, WIGStartInfo, state => { return func.Invoke(arg); }, WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null); Enqueue(workItem); return new WorkItemResultTWrapper(workItem.GetWorkItemResult()); } public IWorkItemResult QueueWorkItem(Func func, T1 arg1, T2 arg2) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem( this, WIGStartInfo, state => { return func.Invoke(arg1, arg2); }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null); Enqueue(workItem); return new WorkItemResultTWrapper(workItem.GetWorkItemResult()); } public IWorkItemResult QueueWorkItem( Func func, T1 arg1, T2 arg2, T3 arg3) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem( this, WIGStartInfo, state => { return func.Invoke(arg1, arg2, arg3); }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null); Enqueue(workItem); return new WorkItemResultTWrapper(workItem.GetWorkItemResult()); } public IWorkItemResult QueueWorkItem( Func func, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem( this, WIGStartInfo, state => { return func.Invoke(arg1, arg2, arg3, arg4); }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3, arg4 } : null); Enqueue(workItem); return new WorkItemResultTWrapper(workItem.GetWorkItemResult()); } #endregion #endregion } }