Done.cs
上传用户:yxdanqu
上传日期:2010-01-07
资源大小:84k
文件大小:2k
源码类别:

搜索引擎

开发平台:

C#

  1. using System;
  2. using System.Threading;
  3. namespace Spider
  4. {
  5. /// <summary>
  6. /// This is a very simple object that
  7. /// allows the spider to determine when
  8. /// it is done. This object implements
  9. /// a simple lock that the spider class
  10. /// can wait on to determine completion.
  11. /// Done is defined as the spider having
  12. /// no more work to complete.
  13. /// 
  14. /// This spider is copyright 2003 by Jeff Heaton. However, it is
  15. /// released under a Limited GNU Public License (LGPL). You may 
  16. /// use it freely in your own programs. For the latest version visit
  17. /// http://www.jeffheaton.com.
  18. ///
  19. /// </summary>
  20. public class Done 
  21. {
  22. /// <summary>
  23. /// The number of SpiderWorker object
  24. /// threads that are currently working
  25. /// on something.
  26. /// </summary>
  27. private int m_activeThreads = 0;
  28. /// <summary>
  29. /// This boolean keeps track of if
  30. /// the very first thread has started
  31. /// or not. This prevents this object
  32. /// from falsely reporting that the spider
  33. /// is done, just because the first thread
  34. /// has not yet started.
  35. /// </summary>
  36. private bool m_started = false;
  37. /// <summary>
  38. /// This method can be called to block
  39. /// the current thread until the spider
  40. /// is done.
  41. /// </summary>
  42. public void WaitDone()
  43. {
  44. Monitor.Enter(this);
  45. while ( m_activeThreads>0 ) 
  46. {
  47. Monitor.Wait(this);
  48. }
  49. Monitor.Exit(this);
  50. }
  51. /// <summary>
  52. /// Called to wait for the first thread to
  53. /// start. Once this method returns the
  54. /// spidering process has begun.
  55. /// </summary>
  56. public void WaitBegin()
  57. {
  58. Monitor.Enter(this);
  59. while ( !m_started ) 
  60. {
  61. Monitor.Wait(this);
  62. }
  63. Monitor.Exit(this);
  64. }
  65. /// <summary>
  66. /// Called by a SpiderWorker object
  67. /// to indicate that it has begun
  68. /// working on a workload.
  69. /// </summary>
  70. public void WorkerBegin()
  71. {
  72. Monitor.Enter(this);
  73. m_activeThreads++;
  74. m_started = true;
  75. Monitor.Pulse(this);
  76. Monitor.Exit(this);
  77. }
  78. /// <summary>
  79. /// Called by a SpiderWorker object to
  80. /// indicate that it has completed a
  81. /// workload.
  82. /// </summary>
  83. public void WorkerEnd()
  84. {
  85. Monitor.Enter(this);
  86. m_activeThreads--;
  87. Monitor.Pulse(this);
  88. Monitor.Exit(this);
  89. }
  90. /// <summary>
  91. /// Called to reset this object to
  92. /// its initial state.
  93. /// </summary>
  94. public void Reset()
  95. {
  96. Monitor.Enter(this);
  97. m_activeThreads = 0;
  98. Monitor.Exit(this);
  99. }
  100. }
  101. }