Exemplo n.º 1
0
        /// <summary>
        /// 通知在当前任务完成后关闭线程
        /// </summary>
        /// <param name="threadId"></param>
        public void CloseAfterCurrTask(int threadId)
        {
            //获取线程NTask对象
            NTask task = getNTask(threadId);

            if (task != null)
            {
                task.Close();
            }
        }
Exemplo n.º 2
0
        //线程执行完毕后的触发事件
        void t_WorkComplete(NTask obj)
        {
            lock (this)
            {
                //首先因为工作执行完了,所以从正在工作字典里删除
                working.Remove(obj.Key);
                //检查是否有等待执行的操作,如果有等待的优先执行等待的任务
                if (waitQueue.Count > 0)
                {
                    //先要注销当前的线程,将其从线程字典删
                    publicPool.Remove(obj.Key);
                    obj.Close();
                    //从等待任务队列提取一个任务
                    WaitItem item = waitQueue.Dequeue();
                    NTask    nt   = null;
                    //如果有空闲的线程,就是用空闲的线程来处理
                    if (freeQueue.Count > 0)
                    {
                        nt = freeQueue.Dequeue();
                    }
                    else
                    {
                        //如果没有空闲的线程就再新创建一个线程来执行
                        nt = new NTask();
                        publicPool.Add(nt.Key, nt);
                        nt.WorkComplete += new Action <NTask>(t_WorkComplete);
                    }

                    //设置线程的执行委托对象和上下文对象
                    nt.taskWorkItem = item.Works;
                    nt.contextdata  = item.Context;
                    //添加到工作字典中
                    working.Add(nt.Key, nt);
                    workingKeys.Add(nt.Key);
                    //唤醒线程开始执行
                    nt.Active();
                }
                else
                {
                    //如果没有等待执行的操作就回收多余的工作线程
                    if (freeQueue.Count > min)
                    {
                        //当空闲线程超过最小线程数就回收多余的这一个
                        publicPool.Remove(obj.Key);
                        obj.Dispose();
                    }
                    else
                    {
                        //如果没超过就把线程从工作字典放入空闲队列
                        obj.contextdata = null;
                        freeQueue.Enqueue(obj);
                    }
                }
            }
        }