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.
Vous devez vous connecter pour publier un commentaire.
Passer à la version asynchrone:
BeginWaitForConnection
.Si elle n'est jamais complète, vous aurez besoin d'un drapeau si le gestionnaire d'achèvement peut simplement appeler
EndWaitForConnection
absorption de toutes les exceptions et la sortie (Fin d'appel... pour s'assurer que toutes les ressources sont en mesure de les nettoyer).C'est ringard, mais c'est la seule méthode que j'ai réalisé. Créer un faux client et vous connecter à votre canal nommé aller au-delà de la WaitForConnection. Fonctionne à chaque fois.
Aussi, même Thread.Abort() n'a pas de résoudre le problème pour moi.
Vous pouvez utiliser la méthode d'extension. Remarque l'inclusion de "ManualResetEvent annulerevénement" - vous pouvez définir cet événement à partir d'un autre thread pour signaler que l'attente se connecter méthode doit abandonner maintenant et à proximité de la canalisation. Inclure annulerevénement.Set() lors de la configuration de m_bShutdownRequested et l'arrêt devrait être assez gracieux.
J'ai écrit cette extension de la méthode pour résoudre ce problème:
WaitForConnection
à l'aide de l'asynchrone homologues.D'une manière qui pourrait fonctionner est la vérification de m_bShutdownRequested à droite après le WaitForConnection.
Pendant le processus d'arrêt défini le type bool. Après cela, envoyer des messages fictifs de tous les tuyaux pour qu'ils s'ouvrent à la connexion et vérification de la bool et arrêter proprement.
Un plus simple et la solution facile est de créer un mannequin client et faire une connexion avec le serveur.
//L'utilisation, la Place de contrôles togglebutton à l'intérieur de StackPanel, et à l'arrière dans le code ainsi:
//A fonctionné comme un charme pour moi. Respectueusement, zzzbc
}