1: class Scheduler
2: {
3:
4: private ManualResetEvent manualResetEvent = new ManualResetEvent(false);
5:
6: private Queue _ClientRequests;
7: public Queue ClientRequests
8: {
9: get { return _ClientRequests; }
10: set { _ClientRequests = value; }
11: }
12:
13: private int _NumberofThreads = 3;
14: public int NumberofThreads
15: {
16: get { return _NumberofThreads; }
17: set { _NumberofThreads = value; }
18: }
19:
20: private bool IsSchedulerStarted = false;
21: private Thread[] StaticThreadPool = null;
22:
23: public Scheduler()
24: {
25: _ClientRequests = Queue.Synchronized(new Queue());
26: StaticThreadPool = new Thread[_NumberofThreads];
27:
28: for (int i = 0; i < StaticThreadPool.Length; i++)
29: {
30: StaticThreadPool[i] = new Thread(new ThreadStart(this.Work));
31: StaticThreadPool[i].IsBackground = true;
32: }
33: }
34:
35: private void Work()
36: {
37: while (true)
38: {
39: ICommand request = null;
40: lock (_ClientRequests.SyncRoot)
41: {
42: if (_ClientRequests.Count > 0)
43: {
44: request = (ICommand)_ClientRequests.Dequeue();
45: }
46: }
47: if (request != null)
48: request.Execute();
49: else
50: manualResetEvent.WaitOne();
51: if (!IsSchedulerStarted) break;
52: }
53: }
54:
55: public void Enqueue(ICommand request)
56: {
57: lock (_ClientRequests.SyncRoot)
58: {
59: _ClientRequests.Enqueue(request);
60: }
61: manualResetEvent.Set();
62: }
63:
64: public void StartScheduler()
65: {
66: foreach (Thread item in StaticThreadPool)
67: {
68: item.Start();
69: }
70: IsSchedulerStarted = true;
71: }
72:
73: public void StopScheduler()
74: {
75: IsSchedulerStarted = false;
76: foreach (Thread item in StaticThreadPool)
77: {
78: if (item != null)
79: {
80: if (item.IsAlive)
81: {
82: item.Join();
83: }
84: }
85: }
86: }
87: }