用C#实现的一个简单任务机,解决了一般任务机无法定时执行任务的问题
2018-01-17 17:55
921 查看
// 自己写的一个任务机,相比一般的任务机的有点,此任务机可以定时执行任务。注释已很明确,不多解释了
/// <summary> /// 任务机 /// </summary> public class TaskRunner { /// <summary> /// 任务执行完之后的回调方法类型 /// </summary> /// <param name="arg0">使用LoadTask添加任务时传入的arg0</param> /// <param name="arg1">使用LoadTask添加任务时传入的arg1</param> /// <param name="arg2">使用LoadTask添加任务时传入的arg2</param> /// <returns></returns> public delegate int Handler(int arg0, object arg1, byte[] arg2); /// <summary> /// 任务描述 /// </summary> struct TaskInfo { /// <summary> /// 任务唯一id /// </summary> static int _id_ = 1; public TaskInfo(int iType, Handler handler, int arg0, object arg1, byte[] arg2, long tmOffset = 0) { this.id = _id_++; this.iType = iType; this.handler = handler; this.arg0 = arg0; this.arg1 = arg1; this.arg2 = arg2; this.trigTick = DateTime.Now.AddMilliseconds(tmOffset).Ticks; } public int id; public int iType; public Handler handler; public int arg0; public object arg1; public byte[] arg2; public long trigTick; // 任务执行时机,只有在此值大于或等于当前时间时,任务才会被触发 } private List<TaskInfo> m_lsTask = null; // 储存任务的list private bool m_bStop = true; private Thread m_ThreadRunner = null; // 用于执行任务的线程 public TaskRunner() { m_lsTask = new List<TaskInfo>(); } /// <summary> /// 添加任务 /// </summary> /// <param name="iType">任务类型,由用户自定义,若不对任务分类则传0</param> /// <param name="handler">任务回调</param> /// <param name="arg0">用户定义参数</param> /// <param name="arg1">用户定义参数</param> /// <param name="arg2">用户定义参数</param> /// <param name="tmOffset">任务执行时机,一个相对于当前时间的偏移值,单位毫秒</param> /// <returns>返回任务id</returns> public int LoadTask(int iType, Handler handler, int arg0, object arg1, byte[] arg2, long tmOffset = 0) { TaskInfo ti = new TaskInfo(iType, handler, arg0, arg1, arg2, tmOffset); lock (m_lsTask) { m_lsTask.Add(ti); } return ti.id; } /// <summary> /// 卸载任务,若id<1则根据iType卸载,若id>0则根据id卸载并忽略iType /// </summary> /// <param name="id">任务id,从LoadTask的返回值获取</param> /// <param name="iType">任务类型,由用户自定义,必须大于0</param> /// <returns>返回成功卸载的任务个数</returns> public int UnloadTask(int id, int iType) { int iCount = 0; lock (m_lsTask) { for (int i = 0; i < m_lsTask.Count;i++ ) { if (id < 1) { if (m_lsTask[i].iType == iType) { m_lsTask.RemoveAt(i); iCount++; i = -1; } } else if (m_lsTask[i].id == id) { m_lsTask.RemoveAt(i); iCount++; break; } } } return iCount; } /// <summary> /// 执行任务的线程 /// </summary> void ThreadRunner() { m_lsTask.Clear(); while (!m_bStop) { Thread.Sleep(50); TaskInfo? taskInfo = null; lock (m_lsTask) { foreach (TaskInfo item in m_lsTask) { if (item.trigTick < DateTime.Now.Ticks) { taskInfo = item; m_lsTask.Remove(item); break; } } } if (taskInfo != null) { taskInfo.Value.handler(taskInfo.Value.arg0, taskInfo.Value.arg1, taskInfo.Value.arg2); } } m_lsTask.Clear(); } /// <summary> /// 开始任务机 /// </summary> internal void Start() { m_bStop = false; m_ThreadRunner = new Thread(new ThreadStart(ThreadRunner)); m_ThreadRunner.Start(); } /// <summary> /// 停止任务机 /// </summary> internal void Stop() { m_bStop = true; m_ThreadRunner.Join(3000); } }
相关文章推荐
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- [转]推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- C#实现一个简单的定时任务
- 发布一个史上最简单代码最少Javascript Timer,解决一切定时执行的问题
- 发布一个史上最简单代码最少Javascript Timer,解决一切定时执行的问题
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
- 利用Cache,asp.net 简单实现定时执行任务
- 解决spring quartz定时任务执行2次的问题
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- C#一个简单的定时小程序实现代码
- linux定时任务生产java服务无法执行问题
- linux crontab设置正确,定时任务无法执行问题
- oracle实现每天定时执行一个计划任务
- oracle怎么实现每天定时执行一个计划任务