Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程返回到池之前,如何阻止?_C#_.net_Multithreading - Fatal编程技术网

C# 在线程返回到池之前,如何阻止?

C# 在线程返回到池之前,如何阻止?,c#,.net,multithreading,C#,.net,Multithreading,作为windows服务的一部分 我正在使用接受传入的套接字连接 myListener.BeginAcceptSocket(AcceptSync,null) acceptsync函数在单独的线程上执行(正如预期的那样) 当服务被请求关闭时,我会向已接受并正在套接字上工作的线程发出“信号”以结束 在向每个线程发送结束信号之后,我需要阻塞,直到它们全部完成。我有一个线程列表,我认为我可以迭代并加入每个线程,直到它们全部完成 然而,这些线程似乎并没有结束,而是返回到池中,所以连接将永远等待 在线程返回到

作为windows服务的一部分 我正在使用接受传入的套接字连接
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();
    }
  }
}