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