标签:
功能描述:
结构设计:
结构关系图:

详细设计:
ThreadWoker
要点设计:
状态图:

关键代码:
1 private void ThreadWorking()
2 {
3 while (_status != ThreadWorkerStatus.Abort)
4 {
5 //WaitOne 返回false表示等待超时,true接到取消等待的通知
6 //这里利用AutoResetEvent.WaitOne的特性来设计闲时控制,false表示空闲到期,true表示新的任务开始
7 if (!_waitEvent.WaitOne(_idleTime))
8 {
9 if (!_isCanIdleExpired) //_isCanIdleExpired变量控制是否允许超时,例如被取出后将不能超时
10 continue;
11
12 _status = ThreadWorkerStatus.Abort;
13 _waitEvent.Close();
14 _waitEvent.Dispose();
15 if (OnIdleExpired != null)
16 OnIdleExpired(this, null); //空闲到期事件通知
17 return;
18 }
19 else if (_status == ThreadWorkerStatus.Abort)
20 return;
21
22 try
23 {
24 Working();
25 }
26 catch (Exception ex)
27 {
28 _logger.TraceEvent(TraceEventType.Error, (int)TraceEventType.Error, ex.ToString());
29 }
30 finally
31 {
32 _status = ThreadWorkerStatus.Idle;
33 if (OnWorkCompleted != null)
34 OnWorkCompleted(this, null); //任务完成事件通知
35 }
36 }
37 }
1 public void Work()
2 {
3 if (_status == ThreadWorkerStatus.Abort)
4 throw new InvalidOperationException("this ThreadWorker was Abort!");
5
6 if (_status == ThreadWorkerStatus.Working)
7 throw new InvalidOperationException("this ThreadWorker was working, unable to duplicate work!");
8
9 _status = ThreadWorkerStatus.Working;
10 _waitEvent.Set(); //通知线程有个新的工作要开始
11 }
ThreadWorkerPoolItem
要点设计:
完整代码:
1 public sealed class ThreadWorkerPoolItem
2 {
3 private ThreadWorkerPoolItemStatus _status;
4 private readonly ThreadWorkerBase _threadWorker;
5 private readonly ThreadWorkerPoolBase _threadWorkerPool;
6 private readonly int _idleTime;
7 private DateTime _startIdleTime;
8
9 internal ThreadWorkerPoolItem(ThreadWorkerPoolBase pool, ThreadWorkerBase threadWorker, ThreadWorkerPoolSettings poolSettings)
10 {
11 _threadWorkerPool = pool;
12 _threadWorker = threadWorker;
13 _threadWorker.OnIdleExpired += _threadWorker_OnIdleExpired;
14 _threadWorker.OnWorkCompleted += _threadWorker_OnWorkCompleted;
15 _threadWorker.Start();
16 _status = ThreadWorkerPoolItemStatus.Idle;
17 _idleTime = poolSettings.IdleTime;
18 }
19
20 void _threadWorker_OnWorkCompleted(object sender, EventArgs args)
21 {
22 _threadWorkerPool.Return(this);
23 }
24
25 void _threadWorker_OnIdleExpired(object sender, EventArgs args)
26 {
27 _threadWorkerPool.Remove(this);
28 }
29
30 internal ThreadWorkerPoolItemStatus Status
31 {
32 get
33 {
34 if (_threadWorker.Status == ThreadWorkerStatus.Abort || _status == ThreadWorkerPoolItemStatus.Abort)
35 return ThreadWorkerPoolItemStatus.Abort;
36
37 return _status;
38 }
39 }
40
41 internal int SurplusIdleTime
42 {
43 get
44 {
45 if (_status == ThreadWorkerPoolItemStatus.Take || _idleTime == -1)
46 return -1;
47
48 int idledTime = (int)(_startIdleTime - DateTime.Now).TotalMilliseconds;
49 if (idledTime >= _idleTime)
50 return 0;
51
52 return idledTime;
53 }
54 }
55
56 internal void SetTake()
57 {
58 _threadWorker.IsCanIdleExpried = false;
59 _status = ThreadWorkerPoolItemStatus.Take;
60 }
61
62 internal void SetIdle()
63 {
64 _startIdleTime = DateTime.Now;
65 _status = ThreadWorkerPoolItemStatus.Idle;
66 _threadWorker.IsCanIdleExpried = true;
67 }
68
69 internal ThreadWorkerBase ThreadWorker
70 {
71 get { return _threadWorker; }
72 }
73 }
ThreadWorkerPool
要点设计:
关键代码:
1 protected bool TryTake(int timeout, out ThreadWorkerBase threadWorker)
2 {
3 threadWorker = null;
4 lock (_takeLocker)
5 {
6 ThreadWorkerPoolItem worker = null;
7 DateTime startWaitTime;
8 while (!_isDestoryed)
9 {
10 worker = _threadWorkerList.Where(e => e.Status == Core.ThreadWorkerPoolItemStatus.Idle).OrderByDescending(e => e.SurplusIdleTime).FirstOrDefault();
11 if (worker == null)
12 {
13 if (_threadWorkerList.Count < _settings.MaxThreadWorkerCount)
14 {
15 worker = this.CreatePoolItem(_threadWorkerList.Count + 1, _settings.IdleTime);
16 worker.SetTake();
17 _threadWorkerList.Add(worker);
18 threadWorker = worker.ThreadWorker;
19 return true;
20 }
21
22 startWaitTime = DateTime.Now;
23 if (!_takeWaitEvent.WaitOne(timeout))
24 {
25 threadWorker = null;
26 return false;
27 }
28
29 if (timeout != -1)
30 {
31 timeout = timeout - (int)(DateTime.Now - startWaitTime).TotalMilliseconds;
32 if (timeout <= 0)
33 {
34 threadWorker = null;
35 return false;
36 }
37 }
38 continue;
39 }
40
41 threadWorker = worker.ThreadWorker;
42 worker.SetTake();
43 return true;
44 }
45
46 threadWorker = null;
47 return false;
48 }
49 }
1 internal void Return(ThreadWorkerPoolItem item)
2 {
3 item.SetIdle();
4 _takeWaitEvent.Set();
5 }
ThreadWorkerPoolManager使用单例模式管理,代码过于简单这里就不贴了......
有兴趣的同学可以点击这里进行下载源码查看:Nutshell.ThreadWorkerPool.zip
github 开源地址: https://github.com/zcylife/Nutshell
标签:
原文地址:http://www.cnblogs.com/Leo_wl/p/5774659.html