首页 > 代码库 > 单线程任务队列

单线程任务队列

<span style="font-weight: bold;">下边代码解决了 避免创建新线程 规避了线程池的创建过多线程 解决浪费资源问题  </span>
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace MyThreadPool
{
  /// <summary>
  /// 线程任务队列
  /// </summary>
  /// <typeparam name="T"></typeparam>
   public  class BackgroundTasks<T>
    {
       /// <summary>
       /// 带参数不带返回值的函数委托
       /// </summary>
       private Action<T> Function;

       /// <summary>
       /// 先进先出队列
       /// </summary>
       private Queue<T> list = new Queue<T>();


       /// <summary>
       /// 构造函数
       /// </summary>
       /// <param name="fun"></param>
       public  BackgroundTasks(Action<T> fun) {
           this.Function = fun;
           Thread th = new Thread(Run);
           th.IsBackground = true;
           th.Start();
       }
       /// <summary>
       /// 执行线程 方法队列
       /// </summary>
       private void Run()
       {
           while (true)
           {
               if (list.Count == 0)
               {
                   Thread.Sleep(10);
               }
               else
               {
                   T data;
                   lock (list)
                   {
                       data = http://www.mamicode.com/list.Dequeue();>
using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace MyThreadPool{    class Program    {        static void Main(string[] args)        {            BackgroundTasks.Add((obj) => {                Console.WriteLine("这个任务的添加时间是1:{0}", obj.ToString());            },DateTime.Now.Millisecond);            BackgroundTasks.Add((obj) =>            {                Console.WriteLine("这个任务的添加时间是2:{0}", obj.ToString());            }, DateTime.Now.Millisecond);            BackgroundTasks.Add((obj) =>            {                Console.WriteLine("这个任务的添加时间是3:{0}", obj.ToString());            }, DateTime.Now.Millisecond);            BackgroundTasks.Add((obj) =>            {                Console.WriteLine("这个任务的添加时间是4:{0}", obj.ToString());            }, DateTime.Now.Millisecond);            ///自定义线程队列 传入泛型参数,只创建一个线程            BackgroundTasks<DateTime> task = new BackgroundTasks<DateTime>(obj =>            {                Console.WriteLine("这个任务的添加时间是5:{0}", obj.ToString());            });            task.Add(DateTime.Now);            ///线程池的 方法 每次调用都创建新线程            ThreadPool.SetMaxThreads(100, 1000);            ThreadPool.QueueUserWorkItem((obj) => {                Console.WriteLine("这个任务的添加时间是6:{0}", obj.ToString());            }, DateTime.Now);            Console.Read();        }    }    /// <summary>    /// 线程任务队列    /// </summary>    public class BackgroundTasks    {        /// <summary>        /// 任务实体        /// </summary>        private class TaskEntity        {            public Action<object> Function;            public object Data;            public TaskEntity(Action<object> func, object data)            {                this.Function = func;                this.Data = http://www.mamicode.com/data;>
由于队列中的任务是单线程执行,可能会导致某些任务在很长时间后才会被执行到,或者重启IIS导致很多任务还没有被执行就被丢弃。无论怎么,这种设计还是适用于很多“一般情况”。

单线程任务队列