/// <summary> /// 根据等待执行队列中,事件的权重,获取线程并且执行 /// </summary> private void ThreadQueueHandle() { lock (curAliveThreadCountLock) { if (curAliveThreadCount >= maxThreadCount) { return; } } ThreadMainHandle handler = null; string id = ""; lock (weightQueue) { if (weightQueue.Count <= 0) { return; } handler = weightQueue.DeQueue(out id); } if (handler != null) { ItemThread item = GetAItem(); item.Start(id, delegate() { handler(); }); lock (aliveList) { aliveList.Add(item); } } }
/// <summary> /// 销毁一个线程 /// </summary> /// <param name="item"></param> private void DestoryThread(ItemThread item) { lock (threadDestoryIds) { threadDestoryIds.Add(item.Id); } }
/// <summary> /// 线程执行报错 /// </summary> /// <param name="item"></param> private void ErrorThread(ItemThread item) { KeyValuePair <string, string> pair = new KeyValuePair <string, string>(item.Id, item.ErrorCode); lock (errorDic) { ErrorMessageHandle handler; //errorDic.Add(pair); if (errorDic.TryGetValue(item.Id, out handler)) { if (handler != null) { handler(item.ErrorCode); } errorDic.Remove(item.Id); } errorList.Add(pair); } lock (curAliveThreadCountLock) curAliveThreadCount--; lock (destoryObjLock) if (isDestory) { item.Stop(); return; } ThreadQueueHandle(); }
/// <summary> /// 销毁线程池 /// </summary> public void Destory() { lock (destoryObjLock) isDestory = true; lock (idleQueue) { for (int i = idleQueue.Count - 1; i >= 0; i--) { ItemThread item = idleQueue.Dequeue(); item.Stop(); } } lock (weightQueue) weightQueue.Clear(); }
/// <summary> /// 线程执行完毕,回归等待队列 /// </summary> /// <param name="item"></param> private void EndThread(ItemThread item) { lock (aliveList) aliveList.Remove(item); lock (curAliveThreadCountLock) curAliveThreadCount--; lock (destoryObjLock) if (isDestory) { item.Stop(); return; } lock (idleQueue) idleQueue.Enqueue(item); ThreadQueueHandle(); }
/// <summary> /// 获取一个线程 /// </summary> /// <returns></returns> private ItemThread GetAItem() { lock (curAliveThreadCountLock) { if (curAliveThreadCount > maxThreadCount) { return(null); } else { curAliveThreadCount++; } } ItemThread item = GetAItemFromIdleQueue(); if (item == null) { item = GenerateOneItem(); } return(item); }
/// <summary> /// 生成一个线程 /// </summary> /// <returns></returns> private ItemThread GenerateOneItem() { ItemThread item = new ItemThread(DestoryThread, EndThread, ErrorThread); return(item); }