簡體   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