如何在线程返回池之前阻塞?

时间:2010-08-23 19:53:35

标签: c# .net multithreading

作为Windows服务的一部分 我正在接受使用的传入套接字连接 myListener.BeginAcceptSocket(acceptAsync, null)

acceptAsync函数在单独的线程上执行(正如预期的那样)。

当请求服务关闭时,我“发信号”接受并正在使用套接字的线程完成。

在发出每个线程结束信号后,我需要阻止它们全部完成。我有一个线程列表,我认为我可以迭代并Join每个线程,直到它们全部完成。

似乎这些线程似乎没有结束,而是返回池中,因此Join将永远等待。

如何在线程返回池之前阻塞?

3 个答案:

答案 0 :(得分:4)

在这种情况下,您不应该使用Join。相反,您应该使用一系列WaitHandles(特别是AutoResetEvent或ManualResetEvent),线程在完成工作后会发出信号。

然后,您将调用static WaitAll method on the WaitHandle类,将所有事件传递给等待。

答案 1 :(得分:3)

执行此操作的规范模式是使用CountdownEvent。主线程将递增事件以指示它正在参与,并且工作线程一旦启动就会执行相同操作。工作线程完成后,他们将减少事件。当主线程准备等待完成时,它应该递减事件然后等待它。如果您不使用.NET 4.0,那么您可以从Joe Albahari's threading ebook的第4部分开始实施倒计时事件。

public class Example
{
  private CountdownEvent m_Finisher = new CountdownEvent(0);

  public void MainThread()
  {
    m_Finisher.AddCount();

    // Your stuff goes here.
    // myListener.BeginAcceptSocket(OnAcceptSocket, null);

    m_Finisher.Signal();
    m_Finisher.Wait();
  }

  private void OnAcceptSocket(object state)
  {
    m_Finisher.AddCount()
    try
    {
      // Your stuff goes here.
    }
    finally
    {
      m_Finisher.Signal();
    }
  }
}

答案 2 :(得分:1)

最好的方法是更改​​acceptAsync以便它在信号量上发出信号,然后您的主线程可以在该信号量上等待。

您没有很多访问或控制Threapool线程的权限。