using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace HPSocketCS { public class HPThreadPool { private IntPtr pThreadPool = IntPtr.Zero; public HPThreadPool() { pThreadPool = ThreadPoolSdk.Create_HP_ThreadPool(); } ~HPThreadPool() { if (pThreadPool != IntPtr.Zero) { ThreadPoolSdk.Destroy_HP_ThreadPool(pThreadPool); } } /// /// 启动线程池组件 /// /// 线程数量, 大于0 -> dwThreadCount, 等于0 -> (CPU核数* 2 + 2), 小于0 -> (CPU核数* (-threadCount)) /// 任务拒绝处理策略 /// 任务队列最大容量(0:不限制,默认:0) /// 线程堆栈空间大小(默认:0 -> 操作系统默认) /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码 public bool Start(uint threadCount, RejectedPolicy policy, uint maxQueueSize = 0, uint stackSize = 0) { return ThreadPoolSdk.HP_ThreadPool_Start(pThreadPool, threadCount, maxQueueSize, policy, stackSize); } /// /// 在规定时间内关闭线程池组件,如果工作线程在最大等待时间内未能正常关闭,会尝试强制关闭,这种情况下很可能会造成系统资源泄漏 /// /// 最大等待时间(毫秒,默认:INFINITE即-1,一直等待) /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码 public bool Stop(int maxWait = -1) { return ThreadPoolSdk.HP_ThreadPool_Stop(pThreadPool, maxWait); } /// /// 向线程池提交异步任务 /// /// 任务处理函数 /// 任务参数 /// 最大等待时间(毫秒,默认:INFINITE即-1,一直等待) /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码,其中,错误码 #ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满 public bool Submit(TaskProc fnTaskProc, IntPtr args, int maxWait = -1) { return ThreadPoolSdk.HP_ThreadPool_Submit(pThreadPool, fnTaskProc, args, maxWait); } /// /// 创建 TSocketTask 对象 /// 创建任务对象,该对象最终需由 DestroySocketTask() 销毁 /// /// 任务入口函数 /// 发起对象, 如server, client,agent对象 /// 连接id /// 数据 /// 数据长度 /// 数据类型 /// 自定义参数 /// 自定义参数 /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满 public static IntPtr CreateSocketTask(SocketTaskProc socketTaskProc, IntPtr sender, IntPtr connId, byte[] buffer, int bufferSize, TaskBufferType taskBufferType, IntPtr wParam, IntPtr lParam) { return ThreadPoolSdk.Create_HP_SocketTaskObj(socketTaskProc, sender, connId, buffer, bufferSize, taskBufferType, wParam, lParam); } /// /// 销毁 TSocketTask 对象 /// /// public static void DestroySocketTask(IntPtr task) { ThreadPoolSdk.Destroy_HP_SocketTaskObj(task); } /// /// 提交 Socket 任务 /// 向线程池提交异步 Socket 任务 /// /// 任务参数 HP_LPTSocketTask /// 最大等待时间(毫秒,默认:INFINITE即-1,一直等待) /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满 public bool SubmitSocketTask(IntPtr task, int maxWait = -1) { return ThreadPoolSdk.HP_ThreadPool_Submit_Task(pThreadPool, task, maxWait); } /// /// 创建 TSocketTask 对象并向线程池提交异步 Socket 任务 /// /// 任务入口函数 /// 发起对象, 如server, client,agent对象 /// 连接id /// 数据 /// 数据长度 /// 数据类型 /// 自定义参数 /// 自定义参数 /// 最大等待时间(毫秒,默认:INFINITE即-1,一直等待) /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码,其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满 public bool SubmitSocketTask(SocketTaskProc socketTaskProc, IntPtr sender, IntPtr connId, byte[] buffer, int bufferSize, TaskBufferType taskBufferType, IntPtr wParam, IntPtr lParam, int maxWait = -1) { var task = CreateSocketTask(socketTaskProc, sender, connId, buffer, bufferSize, taskBufferType, wParam, lParam); if (task == IntPtr.Zero) { return false; } var ret = SubmitSocketTask(task, maxWait); if (!ret) { DestroySocketTask(task); } return ret; } /// /// 增加或减少线程池的工作线程数量 /// /// 线程数量, 大于0 -> dwNewThreadCount, 等于0 -> (CPU核数 * 2 + 2),小于0 -> (CPU核数 * (-dwNewThreadCount)) /// TRUE -- 成功,FALSE -- 失败,可通过 SYS_GetLastError() 获取系统错误代码 public bool AdjustThreadCount(int newThreadCount) { return ThreadPoolSdk.HP_ThreadPool_AdjustThreadCount(pThreadPool, newThreadCount); } /// /// 获取或设置线程池数量 /// /// public int ThreadCount { get { return (int)ThreadPoolSdk.HP_ThreadPool_GetThreadCount(pThreadPool); } set { if (pThreadPool == IntPtr.Zero) { throw new InvalidOperationException("必须先调用Create方法!"); } AdjustThreadCount(value); } } /// /// 检查线程池组件是否已启动 /// /// public bool HasStarted() { return ThreadPoolSdk.HP_ThreadPool_HasStarted(pThreadPool); } /// /// 查看线程池组件当前状态 /// public ServiceState State { get { return ThreadPoolSdk.HP_ThreadPool_GetState(pThreadPool); } } /// /// 获取当前任务队列大小 /// public uint QueueSize { get { return ThreadPoolSdk.HP_ThreadPool_GetQueueSize(pThreadPool); } } /// /// 获取任务队列最大容量 /// public uint MaxQueueSize { get { return ThreadPoolSdk.HP_ThreadPool_GetMaxQueueSize(pThreadPool); } } public RejectedPolicy RejectedPolicy { get { return ThreadPoolSdk.HP_ThreadPool_GetRejectedPolicy(pThreadPool); } } /// /// 获取系统返回的错误码 /// /// public int SYSGetLastError() { return Sdk.SYS_GetLastError(); } } }