C #: compréhension asynchrone de NamedPipeServerStream

J’essayais de trouver un exemple clair et bien de NamedPipeServerStream asynchrone et je ne trouvais aucun modèle qui me convienne.

Je souhaite que NamedPipe Server accepte les messages des clients de manière asynchrone. Le client est simple et c’est bien pour moi. Mais je ne trouve pas d’exemples de serveur, ou je ne comprends pas comment cela fonctionne.

Si j’ai bien compris, je dois créer un object NamedPipeServerStream. Faisons cela:

namedPipeServerStream = new NamedPipeServerStream(PIPENAME, PipeDirection.In, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous, BUFFERSIZE, BUFFERSIZE); 

Semble travailler. Mais je ne sais pas, dois-je utiliser PipeSecurity ou PipeAccessRule du tout? Est ce que je? Mon serveur fonctionnera comme un service Windows sur un système local.

Et ensuite? Je pense que je dois utiliser BeginWaitForConnection pour les connexions asynchrones. Voyons voir:

 namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, ); 

Question 1 : Quelle est cette “chose étrange”? Comment l’utiliser?

Question 2 : devrais-je faire

 while(true) { namedPipeServerStream.BeginWaitForConnection(WaitForConnectionAsyncCallback, ); } 

Pour que mon serveur attende toujours les connexions? Ou j’ai besoin de le faire d’une autre manière?

Et puis … Jetons un coup d’oeil à la fonction WaitForConnectionAsyncCallback:

 private void WaitForConnectionAsyncCallback(IAsyncResult result) { Console.WriteLine("Client connected."); byte[] buff = new byte[BUFFERSIZE]; namedPipeServerStream.Read(buff, 0, namedPipeServerStream.InBufferSize); ssortingng recStr = General.Iso88591Encoding.GetSsortingng(buff, 0, namedPipeServerStream.InBufferSize); Console.WriteLine(" " + recStr); namedPipeServerStream.EndWaitForConnection(result); } 

..Cela ne fonctionne pas bien sûr. Parce que je ne sais pas comment recevoir exactement chaîne de stream. Comment? Maintenant, il déclenche une InvalidOperationException:

Le tuyau n’a pas encore été connecté.

Alors, comment organiser le travail asynchrone avec NamedPipeServerStream?

  • Vous bricolez avec PipeSecurity pour restreindre l’access au tuyau, permettant uniquement aux programmes bénis de se connecter à votre service. Mettez cela en veilleuse jusqu’à ce que tout fonctionne correctement et que vous ayez effectué une parsing de sécurité qui montre que ce type de ressortingction est justifié.

  • La “chose étrange” est simplement un object arbitraire que vous pouvez transmettre à la méthode de rappel. Vous n’en avez pas souvent besoin, mais cela peut être utile si vous écrivez votre rappel afin qu’il serve plusieurs connexions. Dans ce cas, vous devez en savoir plus sur le canal spécifique connecté, l’argument state vous permet de transmettre ces informations. Dans votre méthode de rappel, la propriété result.AsyncState vous renvoie la référence à cet object. Ne vous inquiétez que de cela plus tard, vous en trouverez une utilité quand vous en aurez besoin. Il suffit de passer null jusque-là.

  • C’est un bug. Vous devez d’abord appeler EndWaitForConnection () avant de faire quoi que ce soit avec le tube. Il suffit de le déplacer en haut de la méthode. Vous voulez généralement l’écrire dans un try / catch afin d’attraper ObjectDisposedException, exception qui sera déclenchée lorsque vous fermez le canal avant de quitter votre programme.