1)首先实现一个多线程的辅助类,代码如下:
1 public class ThreadMulti 2 { 3 public delegate void DelegateComplete(); 4 public delegate void DelegateWork(int taskindex,int threadindex); 5 6 public DelegateComplete CompleteEvent; 7 public DelegateWork WorkMethod; 8 9 10 private ManualResetEvent[] _resets; 11 private int _taskCount = 0; 12 private int _threadCount = 5; 13 14 public ThreadMulti(int taskcount) 15 { 16 _taskCount = taskcount; 17 } 18 19 public ThreadMulti(int taskcount, int threadCount) 20 { 21 _taskCount = taskcount; 22 _threadCount = threadCount; 23 } 24 25 public void Start() 26 { 27 if (_taskCount < _threadCount) 28 { 29 //任务数小于线程数的 30 _resets = new ManualResetEvent[_taskCount]; 31 for (int j = 0; j < _taskCount; j++) 32 { 33 _resets[j] = new ManualResetEvent(false); 34 ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { j, j }); 35 } 36 } 37 else 38 { 39 _resets = new ManualResetEvent[_threadCount]; 40 //任务数大于线程数 先把线程数的任务启动 41 for (int i = 0; i < _threadCount; i++) 42 { 43 _resets[i] = new ManualResetEvent(false); 44 ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { i, i }); 45 } 46 //完成一个任务后在利用完成的那个线程执行下一个任务 47 int receivereset = 0; 48 receivereset = ManualResetEvent.WaitAny(_resets); 49 for (int l = _threadCount; l < _taskCount; l++) 50 { 51 _resets[receivereset].Reset(); 52 ThreadPool.QueueUserWorkItem(new WaitCallback(Work), new object[] { l, receivereset }); 53 receivereset = ManualResetEvent.WaitAny(_resets); 54 } 55 } 56 57 ManualResetEvent.WaitAll(_resets); 58 if (CompleteEvent != null) 59 { 60 CompleteEvent(); 61 } 62 } 63 64 public void Work(object arg) 65 { 66 int taskindex = int.Parse(((object[])arg)[0].ToString()); 67 int resetindex = int.Parse(((object[])arg)[1].ToString()); 68 if (WorkMethod != null) 69 { 70 WorkMethod(taskindex + 1, resetindex+1); 71 } 72 _resets[resetindex].Set(); 73 } 74 }