作为Windows服务的一部分
我正在接受使用的传入套接字连接
myListener.BeginAcceptSocket(acceptAsync, null)
acceptAsync
函数在单独的线程上执行(正如预期的那样)。
当请求服务关闭时,我“发信号”接受并正在使用套接字的线程完成。
在发出每个线程结束信号后,我需要阻止它们全部完成。我有一个线程列表,我认为我可以迭代并Join
每个线程,直到它们全部完成。
似乎这些线程似乎没有结束,而是返回池中,因此Join将永远等待。
如何在线程返回池之前阻塞?
答案 0 :(得分:4)
在这种情况下,您不应该使用Join。相反,您应该使用一系列WaitHandles(特别是AutoResetEvent或ManualResetEvent),线程在完成工作后会发出信号。
然后,您将调用static WaitAll method on the WaitHandle类,将所有事件传递给等待。
答案 1 :(得分:3)
执行此操作的规范模式是使用CountdownEvent。主线程将递增事件以指示它正在参与,并且工作线程一旦启动就会执行相同操作。工作线程完成后,他们将减少事件。当主线程准备等待完成时,它应该递减事件然后等待它。如果您不使用.NET 4.0,那么您可以从Joe Albahari's threading ebook的第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();
}
}
}
答案 2 :(得分:1)
最好的方法是更改acceptAsync
以便它在信号量上发出信号,然后您的主线程可以在该信号量上等待。
您没有很多访问或控制Threapool线程的权限。