using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ProjectBase.Data.Threading { /// /// 线程池中的可以取消执行操作的线程池辅助类 /// public static class AbortableThreadPool { private static readonly LinkedList CallbacksList = new LinkedList(); private static readonly Dictionary ThreadList = new Dictionary(); /// /// 把执行操作放到队列中。当线程池的线程可用的时候,方法执行。 /// /// 一个代表将要执行方法的WaitCallback对象 public static WorkItem QueueUserWorkItem(WaitCallback callback) { return QueueUserWorkItem(callback, null); } /// /// 把执行操作放到队列中,并指定了一个对象,它包含将要执行方法的数据。 /// 当线程池的线程可用的时候,方法执行。 /// /// 一个代表将要执行方法的WaitCallback对象 /// 一个对象,它包含将要执行方法的数据 public static WorkItem QueueUserWorkItem(WaitCallback callback, object state) { WorkItem item = new WorkItem(callback, state, ExecutionContext.Capture()); lock (CallbacksList) { CallbacksList.AddLast(item); } ThreadPool.QueueUserWorkItem(new WaitCallback(HandleItem)); return item; } /// /// 处理队列中的线程池工作项目。 /// /// The ignored. private static void HandleItem(object ignored) { WorkItem item = null; try { lock (CallbacksList) { if (CallbacksList.Count > 0) { item = CallbacksList.First.Value; CallbacksList.RemoveFirst(); } if (item == null) { return; } ThreadList.Add(item, Thread.CurrentThread); } ExecutionContext.Run(item.Context, delegate { item.Callback(item.State); }, null); } finally { lock (CallbacksList) { if (item != null) { ThreadList.Remove(item); } } } } /// /// 取消指定的队列中的工作项。 /// /// 线程池中取消的项目 /// 如果设置为则允许终止线程 /// 项目队列的状态 public static WorkItemStatus Cancel(WorkItem item, bool allowAbort) { if (item == null) { throw new ArgumentNullException("item"); } lock (CallbacksList) { LinkedListNode node = CallbacksList.Find(item); if (node != null) { CallbacksList.Remove(node); return WorkItemStatus.Queued; } else if (ThreadList.ContainsKey(item)) { if (allowAbort) { ThreadList[item].Abort(); ThreadList.Remove(item); return WorkItemStatus.Aborted; } else { return WorkItemStatus.Executing; } } else { return WorkItemStatus.Completed; } } } /// /// 获取指定队列中工作项的状态 /// /// 线程池中工作项 /// 工作项的状态 public static WorkItemStatus GetStatus(WorkItem item) { if (item == null) { throw new ArgumentNullException("item"); } lock (CallbacksList) { LinkedListNode node = CallbacksList.Find(item); if (node != null) { return WorkItemStatus.Queued; } else if (ThreadList.ContainsKey(item)) { return WorkItemStatus.Executing; } else { return WorkItemStatus.Completed; } } } /// /// 取消所有任务 /// /// 线程是否终止 public static void CancelAll(bool allowAbort) { lock (CallbacksList) { CallbacksList.Clear(); if (allowAbort) { foreach (Thread t in ThreadList.Values) { t.Abort(); } ThreadList.Clear(); } } } /// /// 类似Thread.Join,等待AbortableThreadPool执行完成 /// public static void Join() { foreach (Thread thread in ThreadList.Values) { thread.Join(); } } /// /// 类似Thread.Join,等待AbortableThreadPool执行完成 /// /// 等待的毫秒数 /// public static bool Join(int millisecondsTimeout) { foreach (Thread thread in ThreadList.Values) { if (!thread.Join(millisecondsTimeout)) { return false; } } return true; } /// /// 类似Thread.Join,等待AbortableThreadPool执行完成 /// /// 等待的时间范围 /// public static bool Join(TimeSpan timeout) { foreach (Thread thread in ThreadList.Values) { if (!thread.Join(timeout)) return false; } return true; } /// /// 在队列中,还未执行处理的数量 /// public static int QueueCount { get { lock (CallbacksList) { return CallbacksList.Count; } } } /// /// 在执行中的线程数量 /// public static int WorkingCount { get { lock (ThreadList) { return ThreadList.Count; } } } } }