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 /// /// 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 /// /// A callback to execute /// The priority of the work item /// Returns a work item result public IWorkItemResult QueueWorkItem(WorkItemCallback callback, WorkItemPriority workItemPriority) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, workItemPriority); 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 /// /// A callback to execute /// /// The context object of the work item. Used for passing arguments to the work item. /// /// The work item priority /// Returns a work item result public IWorkItemResult QueueWorkItem(WorkItemCallback callback, object state, WorkItemPriority workItemPriority) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, workItemPriority); 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 /// /// The work item priority /// Returns a work item result public IWorkItemResult QueueWorkItem( WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, WorkItemPriority workItemPriority) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, workItemPriority); 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(); } /// /// 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 /// The work item priority /// Returns a work item result public IWorkItemResult QueueWorkItem( WorkItemCallback callback, object state, PostExecuteWorkItemCallback postExecuteWorkItemCallback, CallToPostExecute callToPostExecute, WorkItemPriority workItemPriority) { PreQueueWorkItem(); WorkItem workItem = WorkItemFactory.CreateWorkItem(this, WIGStartInfo, callback, state, postExecuteWorkItemCallback, callToPostExecute, workItemPriority); Enqueue(workItem); return workItem.GetWorkItemResult(); } #endregion #region QueueWorkItem(Action<...>) public IWorkItemResult QueueWorkItem(Action action) { return QueueWorkItem (action, SmartThreadPool.DefaultWorkItemPriority); } public IWorkItemResult QueueWorkItem (Action action, WorkItemPriority priority) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, delegate { action.Invoke (); return null; }, priority); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem(Action action, T arg) { return QueueWorkItem (action, arg, SmartThreadPool.DefaultWorkItemPriority); } public IWorkItemResult QueueWorkItem (Action action, T arg, WorkItemPriority priority) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg } : null, priority); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem(Action action, T1 arg1, T2 arg2) { return QueueWorkItem (action, arg1, arg2, SmartThreadPool.DefaultWorkItemPriority); } public IWorkItemResult QueueWorkItem (Action action, T1 arg1, T2 arg2, WorkItemPriority priority) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg1, arg2); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2 } : null, priority); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem(Action action, T1 arg1, T2 arg2, T3 arg3) { return QueueWorkItem (action, arg1, arg2, arg3, SmartThreadPool.DefaultWorkItemPriority); ; } public IWorkItemResult QueueWorkItem (Action action, T1 arg1, T2 arg2, T3 arg3, WorkItemPriority priority) { PreQueueWorkItem (); WorkItem workItem = WorkItemFactory.CreateWorkItem ( this, WIGStartInfo, state => { action.Invoke (arg1, arg2, arg3); return null; }, WIGStartInfo.FillStateWithArgs ? new object[] { arg1, arg2, arg3 } : null, priority); Enqueue (workItem); return workItem.GetWorkItemResult (); } public IWorkItemResult QueueWorkItem( Action action, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { return QueueWorkItem (action, arg1, arg2, arg3, arg4, SmartThreadPool.DefaultWorkItemPriority); } public IWorkItemResult QueueWorkItem ( Action action, T1 arg1, T2 arg2, T3 arg3, T4 arg4, WorkItemPriority priority) { 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, priority); 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 } }