繁体   English   中英

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

[英]How do I block until a thread is returned to the pool?

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

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

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

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

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

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

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

然后,您将在WaitHandle调用静态WaitAll方法 ,将所有事件传递给等待。

执行此操作的规范模式是使用CountdownEvent 主线程将递增事件以指示它正在参与,并且工作线程一旦启动就会执行相同操作。 工作线程完成后,他们将减少事件。 当主线程准备等待完成时,它应该递减事件然后等待它。 如果您不使用.NET 4.0,那么您可以从Joe Albahari的线程电子书的第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();
    }
  }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM