代码之家  ›  专栏  ›  技术社区  ›  Ralph Shillington

如何阻止线程返回池?

  •  3
  • Ralph Shillington  · 技术社区  · 14 年前

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

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

    当服务被请求关闭时,我向接受的线程发出“信号”,并且当前正在处理套接字,以完成该操作。

    在向每个线程发出结束的信号后,我需要阻塞,直到它们全部完成。我有一个线程列表,我想我可以迭代 Join 每一个线程,直到他们都完成。

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

    如何阻止线程返回池?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Brian Gideon    14 年前

    这样做的标准模式是使用 CountdownEvent . 主线程将增加事件以指示它正在参与,并且工作线程在启动后也将执行相同的操作。工作线程完成后,将递减事件。当主线程准备等待完成时,它应该减少事件,然后等待完成。如果不使用.NET 4.0,则可以从的第4部分获得倒计时事件的实现。 Joe Albahari's threading ebook .

    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
  •  4
  •   casperOne    14 年前

    在这种情况下不应该使用join。相反,您应该使用一系列waithandles(特别是autoreseteevent或manuallresetevent),当线程完成它们的工作时,它们会发出信号。

    然后你会打电话给 static WaitAll method on the WaitHandle 类,传递所有要等待的事件。

        3
  •  1
  •   Henk Holterman    14 年前

    最好的办法是改变 acceptAsync 所以它在信号量上发出信号,您的主线程就可以等待该信号量。

    你没有太多的访问或控制线程三apool。