Ejemplo n.º 1
0
 //线程执行完毕后的触发事件
 void t_WorkComplete(TreadWrap obj)
 {
     lock (this)
     {
         //首先因为工作执行完了,所以从正在工作字典里删除
         working.Remove(obj.Key);
         //检查是否有等待执行的操作,如果有等待的优先执行等待的任务
         if (waitlist.Count > 0)
         {
             //先要注销当前的线程,将其从线程字典删除
             publicpool.Remove(obj.Key);
             obj.Close();
             //从等待任务队列提取一个任务
             Waititem  item = waitlist.Dequeue();
             TreadWrap nt   = null;
             //如果有空闲的线程,就是用空闲的线程来处理
             if (freequeue.Count > 0)
             {
                 nt = freequeue.Dequeue();
             }
             else
             {
                 //如果没有空闲的线程就再新创建一个线程来执行
                 nt = new TreadWrap();
                 publicpool.Add(nt.Key, nt);
                 nt.WorkComplete += new Action <TreadWrap>(t_WorkComplete);
             }
             //设置线程的执行委托对象和上下文对象
             nt.TaskWorkItem = item.Works;
             nt.Contextdata  = item.Context;
             //添加到工作字典中
             working.Add(nt.Key, nt);
             //唤醒线程开始执行
             nt.Active();
         }
         else
         {
             //如果没有等待执行的操作就回收多余的工作线程
             if (freequeue.Count > min)
             {
                 //当空闲线程超过最小线程数就回收多余的这一个
                 publicpool.Remove(obj.Key);
                 obj.Close();
             }
             else
             {
                 //如果没超过就把线程从工作字典放入空闲队列
                 obj.Contextdata = null;
                 freequeue.Enqueue(obj);
             }
         }
     }
 }
Ejemplo n.º 2
0
        //初始化线程池
        private TaskPool()
        {
            publicpool = new Dictionary <string, TreadWrap>();
            working    = new Dictionary <string, TreadWrap>();
            freequeue  = new Queue <TreadWrap>();
            waitlist   = new Queue <Waititem>();
            TreadWrap t = null;

            //先创建最小线程数的线程
            for (int i = 0; i < min; i++)
            {
                t = new TreadWrap();
                //注册线程完成时触发的事件
                t.WorkComplete += new Action <TreadWrap>(t_WorkComplete);
                //加入到所有线程的字典中
                publicpool.Add(t.Key, t);
                //因为还没加入具体的工作委托就先放入空闲队列
                freequeue.Enqueue(t);
            }
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 添加工作委托的方法
 /// </summary>
 /// <param name="taskItem">表示线程池线程要执行的回调方法</param>
 /// <param name="threadName">设置线程名</param>
 /// <param name="state">包含回调方法要使用的信息的对象</param>
 public void AddTaskItem(WaitCallback taskItem, string threadName = null, object state = null)
 {
     lock (this)
     {
         TreadWrap t   = null;
         int       len = publicpool.Values.Count;
         //如果线程没有到达最大值
         if (len < max)
         {
             //如果空闲列表非空
             if (freequeue.Count > 0)
             {
                 //从空闲队列pop一个线程
                 t = freequeue.Dequeue();
                 //加入工作字典
                 working.Add(t.Key, t);
                 //设置执行委托
                 t.TaskWorkItem = taskItem;
                 //设置状态对象
                 t.Contextdata = state;
                 //唤醒线程开始执行
                 t.Active();
                 return;
             }
             else
             {
                 //如果没有空闲队列了,就根据增量创建线程
                 for (int i = 0; i < increment; i++)
                 {
                     //判断线程的总量不能超过max
                     if ((len + i) <= max)
                     {
                         t = new TreadWrap();
                         //设置完成响应事件
                         t.WorkComplete += new Action <TreadWrap>(t_WorkComplete);
                         //加入线程字典
                         publicpool.Add(t.Key, t);
                         //加入空闲队列
                         freequeue.Enqueue(t);
                     }
                     else
                     {
                         break;
                     }
                 }
                 //从空闲队列提出出来设置后开始执行
                 t = freequeue.Dequeue();
                 working.Add(t.Key, t);
                 t.TaskWorkItem = taskItem;
                 t.Contextdata  = state;
                 t.Active();
                 return;
             }
         }
         else
         {
             //如果线程达到max就把任务加入等待队列
             waitlist.Enqueue(new Waititem()
             {
                 Context = state, Works = taskItem
             });
         }
     }
 }