Je lance mon application qui génère un certain nombre de threads, chacun d'entre eux créant un NamedPipeServer (.net 3.5 a ajouté des types gérés pour Named Pipe IPC) et attendant que les clients se connectent (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'une méthode d'arrêt pour arrêter ce processus proprement. J'ai essayé le truc habituel du bool flag isShutdownRequested. Mais le pipestream reste bloqué sur l'appel WaitForConnection() et le thread ne meurt pas.
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!");
}
}
Join ne revient jamais.
Une option que je n'ai pas essayée mais qui pourrait fonctionner est d'appeler Thread.Abort et de manger l'exception. Mais cela ne me semble pas correct. Des suggestions ?
Mise à jour 2009-12-22
Désolé de ne pas avoir posté ceci plus tôt Voici ce que j'ai reçu comme réponse de Kim Hamilton (équipe BCL)
La "bonne" façon de faire un interruptible WaitForConnection interruptible est d'appeler BeginWaitForConnection, de gérer le nouvel événement nouvelle connexion dans le callback, et de fermer le flux de tuyaux pour arrêter d'attendre que connexions. Si le tuyau est fermé, EndWaitForConnection lèvera l'exception ObjectDisposedException que le fil de rappel peut attraper, nettoyer et quitter proprement.
Nous réalisons que cela doit être un problème commun question, donc quelqu'un de mon équipe prévoit d'ouvrir un blog sur ce sujet prochainement.