如何快速学成网站开发,网络域名的网站,有哪些做汽配的网站,wordpress前台登陆插件如果有些任务需要在后台自动执行#xff0c;且时不时需要添加一个任务#xff0c;且按照优先级顺序执行#xff0c;那么可以参考本文的方法。
后台任务类
定义一个后台任务类BackgroundTaskThread#xff0c;其中Start方法是用来启动任务的#xff0c;循环查询是否有添加…如果有些任务需要在后台自动执行且时不时需要添加一个任务且按照优先级顺序执行那么可以参考本文的方法。
后台任务类
定义一个后台任务类BackgroundTaskThread其中Start方法是用来启动任务的循环查询是否有添加任务外部一般就调用AppendTask来添加任务。循环任务发现任务有添加后会自动执行。如果有多个任务会按加入的顺序一个一个执行。
public class BackgroundTaskThread
{/// summary/// 任务列表/// /summaryprivate ListTaskItem TaskItems new ListTaskItem();/// summary/// 等待时间/// /summarypublic int MillSeconds 1000;/// summary/// 自动重置/// /summarypublic AutoResetEvent TaskSet new AutoResetEvent(false);/// summary/// 任务取消标识/// /summarypublic CancellationTokenSource Source { get; set; } new CancellationTokenSource();/// summary/// 日志/// /summarypublic ILog Log { get; set; }/// summary/// 线程数量/// /summarypublic int ThreadNum { get; private set; }/// summary/// 任务线程/// /summarypublic ListTask TaskThreads new ListTask();/// summary/// 启动/// /summary/// param nametaskTimeSpan任务扫描间隔/param/// param nametaskNum任务数量/parampublic void Start(int taskTimeSpan, int taskNum){ThreadNum taskNum;for (int i 0; i taskNum; i){MillSeconds taskTimeSpan;Task task new Task(BackgroundThread);task.Start();TaskThreads.Add(task);}}/// summary/// 后台任务/// /summaryprivate void BackgroundThread(){try{while (!Source.Token.IsCancellationRequested){var item GetOrSetTaskItem(true, null);if(item null){TaskSet.WaitOne(MillSeconds);}else{try{item.Task.Invoke(item.Param);}catch (Exception ex){Log.error(任务 : , item.Name, 异常停止.,.., ex);}}}}catch (Exception ex){Log.error(后台任务线程异常退出...., ex);}}/// summary/// 读取或者/// /summary/// param nameisGet是否是获取/param/// param nameitem任务项/param/// returns/returnsprotected TaskItem GetOrSetTaskItem(bool isGet, TaskItem item){lock (this){if (isGet){if (TaskItems.Count 0)return null;item TaskItems[0];TaskItems.RemoveAt(0);return item;}else{TaskItems.Add(item);return item;}}}/// summary/// 追加任务/// /summary/// param nametask/param/// param nameparam/parampublic void AppendTask(Actionobject task, object param){GetOrSetTaskItem(false, new TaskItem() { Task task, Param param });TaskSet.Set();}/// summary/// 释放/// /summarypublic void Dispose(){if(TaskThreads.Count 0)Source.Cancel();TaskItems.Clear();}
}内部任务定义类
public class TaskItem
{/// summary/// 任务/// /summarypublic Actionobject Task { get; set; }/// summary/// 参数/// /summarypublic object Param { get; set; }/// summary/// 任务名称/// /summarypublic string Name { get; set; } string.Empty;
}实际任务
public class DoSomethingTaskThread : BackgroundTaskThread
{public void AppendSomething(object data){AppendTask(DoSomething, data);}private void DoSomething(object data){//TODO}
}外部调用
当然最好把DoSomethingTaskThread这个子类做成单例后面直接
//启动任务同步的话线程数传1异步的话线程数可以传多点
DoSomethingTaskThread.Start(1000,1);//添加任务
DoSomethingTaskThread.AppendSomething(new object());