最近为短信发送插件简单做了个多线程小模块。不多说。直接上代码。
一:对线程任务的简单封装
/// <summary> /// 任务线程 /// </summary> public class TaskdPool : IDisposable { public List<ThreadTask> TaskPool = new List<ThreadTask>(); private Thread _thread; /// <summary> /// 任务池 /// </summary> private Thread MyThread { get { return _thread; } set { _thread = value; } } static int maxCount = 30; /// <summary> /// 向任务池添加一个任务单元! /// </summary> /// <param name="task"></param> public void AddTask(ThreadTask task) { if (maxCount < TaskPool.Count) { return; } var tasks = TaskPool.Where(p => p.MarkGuid == task.MarkGuid); if (tasks.Any()) { var theTask = tasks.Take(1).Single(); } TaskPool.Add(task); } bool isRurn { get; set; } /// <summary> /// 启动线程 执行任务 /// by zhiyong 2013.10.19 /// </summary> public void StartThread() { MyThread = new Thread(new ThreadStart(DoTask)); MyThread.Name = "线程" + Guid.NewGuid().ToString(); MyThread.Start(); isRurn = true;
// 此处可拓展,自定义线程池,将线程添加到线程池。当线程因为未知原因挂起或者程序占用资源居高不下的时候可以对线程池强制回收收资源。 // LogManager.Logs["短信线程日志"].WriteLine("线程:" + MyThread.Name + "开启"); } /// <summary> /// 任务开始 回调函数 /// chenzhiyong 2013.10.19 /// </summary> private void DoTask() { if (TaskPool.Count > 0) { foreach (var item in TaskPool) { item.Function(item.item); } } Dispose(); } #region IDisposable 成员 public void Dispose() { if (MyThread != null) { MyThread.IsBackground = false; //LogManager.Logs["短信线程日志"].WriteLine("线程:" + MyThread.Name + "关闭"); isRurn = false; try { MyThread.Abort(); // GC.Collect(); } catch (Exception) { } } } #endregion }
线程执行完毕后会调用 abort方法将线程终止。只是终止。GC会在适合的时候回收终止的线程。
二:对线程任务单元的简单封装
/// <summary> /// 线程任务单元 /// </summary> public class ThreadTask { public Func<Sms_Send,bool> Function; public string MarkGuid { get; set; } public Sms_Send item { get; set; } }
三:简单的调用
ThreadTask task = new ThreadTask(); task.item = item; task.MarkGuid = DateTime.Now.ToString("yyyyMMddhhmmss"); task.Function = StartSend; TaskdPool _taskPoll = new TaskdPool(); _taskPoll.AddTask(task); _taskPoll.StartThread();
1 ,StartSend 这是一个回调函数。
2, _taskPoll.AddTask(task); 是将任务单元添加到任务池子。
3,item是一个实体类。会调函数用的到。
ps:欢迎指正!