[英]I have a thread.pool and how can i make Main Thread wait until all task are completed?
[英]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.