核心欄位:m_activeThreads (活動線程數)、m_started (是否進入正式階段)。
public void WaitBegin()
{
lock (this)
{
while (!m_started) Monitor.Wait(this);
}
}
public void WorkerBegin()
{
lock (this)
{
m_activeThreads++;
m_started = true;
Monitor.Pulse(this); // 喚醒 WaitBegin
}
}
public void WorkerEnd()
{
lock (this)
{
m_activeThreads--;
Monitor.Pulse(this); // 喚醒 WaitDone
}
}
public void WaitDone()
{
lock (this)
{
while (m_activeThreads > 0) Monitor.Wait(this);
}
}
WaitBegin() 阻塞直到第一個 WorkerBegin。WaitDone() 阻塞直到 m_activeThreads 歸零。WorkerBegin(),完成後呼叫 WorkerEnd()。此模式解決「初始階段無活動線程導致 WaitDone 過早返回」的問題,確保準確偵測爬蟲真正完成。