C# 在线程返回到池之前,如何阻止?
作为windows服务的一部分 我正在使用接受传入的套接字连接C# 在线程返回到池之前,如何阻止?,c#,.net,multithreading,C#,.net,Multithreading,作为windows服务的一部分 我正在使用接受传入的套接字连接 myListener.BeginAcceptSocket(AcceptSync,null) acceptsync函数在单独的线程上执行(正如预期的那样) 当服务被请求关闭时,我会向已接受并正在套接字上工作的线程发出“信号”以结束 在向每个线程发送结束信号之后,我需要阻塞,直到它们全部完成。我有一个线程列表,我认为我可以迭代并加入每个线程,直到它们全部完成 然而,这些线程似乎并没有结束,而是返回到池中,所以连接将永远等待 在线程返回到
myListener.BeginAcceptSocket(AcceptSync,null)
acceptsync
函数在单独的线程上执行(正如预期的那样)
当服务被请求关闭时,我会向已接受并正在套接字上工作的线程发出“信号”以结束
在向每个线程发送结束信号之后,我需要阻塞,直到它们全部完成。我有一个线程列表,我认为我可以迭代并加入每个线程,直到它们全部完成
然而,这些线程似乎并没有结束,而是返回到池中,所以连接将永远等待
在线程返回到池之前,如何进行阻止?在这种情况下,不应使用Join。相反,您应该使用一系列WaitHandles(特别是AutoResetEvent或ManualResetEvent),当线程完成工作时,它们将发出信号
然后调用该类,传递所有要等待的事件。最好的方法是更改
acceptsync
以便它在信号量上发出信号,然后主线程可以在该信号量上等待
您没有很多权限访问或控制Threapool线程 这样做的标准模式是使用。主线程将递增事件以指示它正在参与,工作线程在启动后也将执行相同的操作。工作线程完成后,它们将减少事件。当主线程准备等待完成时,它应该减少事件,然后等待它。如果您没有使用.NET 4.0,则可以从的第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();
}
}
}