using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ProjectBase.Data.Threading { /// /// 线程池辅助操作类 /// public class ThreadPoolHelper { /// /// 方法委托 /// public delegate void WaitCallbackNew(); /// /// (集合)通知等待线程,事件已经发生。这个类不能被继承。 /// private static List AutoResetEvents; /// /// 线程池的实际WaitCallback委托对象。 /// /// static void Callback(object state) { WaitCallbackHelper wcbh = (state as WaitCallbackHelper); wcbh.Callback(); (wcbh.WaitHandle as AutoResetEvent).Set(); } /// /// 把执行方法放到队列中。 /// 当线程池线程变为可用的时候,方法执行。 /// /// 委托对象 public static bool QueueUserWorkItem(WaitCallbackNew callback) { WaitCallbackHelper wcbh = new WaitCallbackHelper(); wcbh.Callback = callback; wcbh.WaitHandle = new AutoResetEvent(false); if (AutoResetEvents == null) { AutoResetEvents = new List(); } AutoResetEvents.Add(wcbh.WaitHandle); return ThreadPool.QueueUserWorkItem(new WaitCallback(Callback), wcbh); } /// /// 把执行方法放到队列中。 /// 当线程池线程变为可用的时候,方法执行。 /// /// 委托对象数组 /// public static bool QueueUserWorkItems(params WaitCallbackNew[] proc) { bool result = true; foreach (WaitCallbackNew tp in proc) { result &= QueueUserWorkItem(tp); } return result; } /// ///等待指定数组中所有元素收到信号 /// public static bool WaitAll() { return WaitHandle.WaitAll(AutoResetEvents.ToArray()); } /// ///等待指定数组中任何一个元素收到信号 /// /// 满足等待的对象数组索引 public static int WaitAny() { return WaitHandle.WaitAny(AutoResetEvents.ToArray()); } /// /// 一个回调一个WaitHandle容器 /// class WaitCallbackHelper { public WaitCallbackNew Callback { get; set; } public WaitHandle WaitHandle { get; set; } } } }