/// <summary> /// Excecutes threads on queue until none are left /// </summary> /// <param name="join">Wait for ThreadInstance to finish before re-joining with the main thread?</param> private void RunThreads(bool join = false) { if (ThreadQueue.Count() <= 0) { return; } ThreadInstance = new Thread(() => { ThreadingEventArgs args = new ThreadingEventArgs(); args.ThreadQueue = ThreadQueue; OnThreadQueueStarted(args); while (ThreadQueue.Count > 0) { RunThread(); } OnThreadQueueFinished(null); }); ThreadInstance.IsBackground = true; ThreadInstance.Start(); if (join) { ThreadInstance.Join(); } }
/// <summary> /// Excecutes threads on queue until none are left /// </summary> private void ExcecuteQueue() { if (ThreadQueue.Count() <= 0) { return; } ThreadInstance = new Thread(() => { ThreadingEventArgs args = new ThreadingEventArgs(); args.ThreadQueue = ThreadQueue; OnThreadQueueStarted(args); while (ThreadQueue.Count > 0) { ThreadQueue.Peek().IsBackground = true; ThreadQueue.Peek().Start(); ThreadQueue.Peek().Join(); ThreadingEventArgs removeArgs = new ThreadingEventArgs(); args.Thread = ThreadQueue.Peek(); ThreadQueue.Dequeue(); ItemRemovedFromThreadQueue(args); } OnThreadQueueFinished(null); }); ThreadInstance.IsBackground = true; ThreadInstance.Start(); }
/// <summary> /// Event fired when an item is removed from ThreadQueue /// </summary> /// <param name="e">The thread that was removed from queue is passed as arg</param> public void ItemRemovedFromThreadQueue(ThreadingEventArgs e) { EventHandler <ThreadingEventArgs> handler = ThreadQueueItemRemoved; if (handler != null) { handler(this, e); } }
/// <summary> /// Event fired when an item is added to the ThreadQueue /// </summary> /// <param name="e">The thread that was added to the queue is passed as an arg</param> public void ItemAddedToThreadQueue(ThreadingEventArgs e) { EventHandler <ThreadingEventArgs> handler = ThreadQueueItemAdded; if (handler != null) { handler(this, e); } }
/// <summary> /// Event fired when ThreadQueue finished executing all threads /// </summary> /// <param name="e">Can be null</param> public void OnThreadQueueFinished(ThreadingEventArgs e) { EventHandler <ThreadingEventArgs> handler = ThreadQueueFinished; if (handler != null) { handler(this, e); } }
/*public static void AddToQueue(Func func) * { * AddToQueue(new Thread(() => func())); * }*/ /// <summary> /// Add a thread to the ThreadQueue. It will execute the thread immediately if the thread Instance for this class isn't running /// </summary> /// <param name="thread">Thread to be added to the ThreadQueue</param> public static void AddToQueue(Thread thread) { if (ThreadQueue == null) { ThreadQueue = new Queue <Thread>(); } ThreadQueue.Enqueue(thread); ThreadingEventArgs args = new ThreadingEventArgs(); args.Thread = thread; Instance.ItemAddedToThreadQueue(args); if (!IsThreadRunning()) { Instance.ExcecuteQueue(); } }
/// <summary> /// Add a thread to the ThreadQueue. It will execute the thread immediately if the thread Instance for this class isn't running /// </summary> /// <param name="thread">Thread to be added to the ThreadQueue</param> public static void AddToQueue(Thread thread, ApartmentState threadType = ApartmentState.Unknown, bool join = false) { if (ThreadQueue == null) { ThreadQueue = new Queue <Thread>(); } thread.SetApartmentState(threadType); ThreadQueue.Enqueue(thread); ThreadingEventArgs args = new ThreadingEventArgs(); args.Thread = thread; Instance.ItemAddedToThreadQueue(args); if (!IsThreadRunning()) { Instance.ExecuteQueue(join); } }
/// <summary> /// Run the first thread in the ThreadQueue /// </summary> private void RunThread(bool nullifyThreadInst = false) { ThreadQueue.Peek().IsBackground = true; ThreadQueue.Peek().Start(); runningThreads++; if (runningThreads >= 3) { ThreadQueue.Peek().Join(); runningThreads--; } ThreadingEventArgs removeArgs = new ThreadingEventArgs(); removeArgs.Thread = ThreadQueue.Peek(); ThreadQueue.Dequeue(); ItemRemovedFromThreadQueue(removeArgs); }