Ce qui est un bon moyen pour arrêter les Threads bloqués sur NamedPipeServer#WaitForConnection?

Je commence ma demande, qui engendre un certain nombre de Fils, chaque de ce qui crée une NamedPipeServer (.net 3.5 ajouté géré types de canal Nommé CIB) et attend les clients à se connecter (Blocs). Le code fonctionne comme prévu.

private void StartNamedPipeServer()
  {
    using (NamedPipeServerStream pipeStream =
                    new NamedPipeServerStream(m_sPipeName, PipeDirection.InOut, m_iMaxInstancesToCreate, PipeTransmissionMode.Message, PipeOptions.None))
    {
      m_pipeServers.Add(pipeStream);
      while (!m_bShutdownRequested)
      {
        pipeStream.WaitForConnection();
        Console.WriteLine("Client connection received by {0}", Thread.CurrentThread.Name);
        ....  

Maintenant, j'ai aussi besoin d'un Arrêt de méthode pour faire de ce processus correctement. J'ai essayé l'habitude bool drapeau isShutdownRequested truc. Mais le pipestream reste bloqué sur la WaitForConnection() appel et que le thread n'a pas de mourir.

public void Stop()
{
   m_bShutdownRequested = true;
   for (int i = 0; i < m_iMaxInstancesToCreate; i++)
   {
     Thread t = m_serverThreads[i];
     NamedPipeServerStream pipeStream = m_pipeServers[i];
     if (pipeStream != null)
     {
       if (pipeStream.IsConnected)
          pipeStream.Disconnect();
       pipeStream.Close();
       pipeStream.Dispose();
     }

     Console.Write("Shutting down {0} ...", t.Name);
     t.Join();
     Console.WriteLine(" done!");
   }
} 

Joindre à ne jamais revenir.

Une option que je n'ai pas essayer, mais serait peut-être le travail consiste à appeler Fil.Abandonner et de manger de l'exception. Mais il ne se sent pas le droit.. des suggestions

Mise à jour 2009-12-22

Désolé de ne pas poster plus tôt.. C'est ce que j'ai reçu comme réponse de Kim Hamilton (BCL équipe)

La "bonne" façon de faire une coupure
WaitForConnection est d'appeler
BeginWaitForConnection, gérer la nouvelle
connexion dans le rappel, et à proximité
le tuyau de flux de cesser d'attendre
les connexions. Si le tuyau est fermé,
EndWaitForConnection va jeter
ObjectDisposedException qui l'
rappel thread peut attraper, nettoyer
toutes les extrémités lâches, et de s'arrêter proprement.

Nous réalisons cela doit être commune
question, si quelqu'un de mon équipe
de la planification à un blog sur ce sujet bientôt.

InformationsquelleAutor Gishu | 2009-03-03