[英]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.