2010-03-01 6 views
5

J'ai regardé partout sur le Web, mais je ne trouve pas de réponse à la question suivante. J'ai une instance NamedPipeClientStream C#/.NET dans un programme client, et un thread de travail appelle NamedPipeClientStream.Read (byte [], int, int) pour obtenir des données d'un serveur. Le serveur envoie des mises à jour de données au client.Annuler l'appel NamedPipeClientStream.Read

Read est un appel bloquant. Si je veux fermer le client, existe-t-il un moyen d'annuler/de quitter l'appel Read? J'ai essayé d'appeler Close sur l'instance de pipe nommée, mais cela n'a aucun effet sur le thread appelé Read.

Je pense qu'il y aurait un moyen d'annuler un appel en lecture. Sinon, il semble que c'est une API très mal conçue, parce que votre programme est à la merci du tuyau.

Toute information est grandement appréciée.

-Chris

Répondre

7

Utilisez le constructeur NamedPipeClientStream qui prend un argument PipeOptions. La spécification de PipeOptions.Asynchronous termine l'appel Read() lorsque vous appelez la méthode Close(). La méthode Read() renvoie 0.

+0

: D Vous êtes mon héros! Définir le canal sur asynchrone provoque un appel bloqué à Lire pour retourner lorsque Close est appelé. Merci beaucoup! – Chris

0

Pas une réponse directe à votre question, mais - je devais faire un peu NamedPipe IPC tout récemment et j'ai trouvé que WCF était génial. Il m'a fallu moins d'une heure pour implémenter un POC et oui, je suis à peu près sûr qu'il expose des moyens d'annuler votre demande non plus - et vous n'avez pas besoin de penser en termes de tableaux d'octets.

Est-ce une option pour vous?

+1

J'ai regardé un peu dans WCF et je suis vraiment excité par cela, mais malheureusement le client que je développe doit parler à un serveur personnalisé (C++, pas .NET) avec son propre Tuyaux nommés prédéfinis et protocole de communication. Quand je regardais WCF, j'ai été rapidement submergé par l'immensité de la documentation. Je n'ai pas pu déterminer rapidement si je pouvais utiliser WCF pour parler à un système existant en utilisant des tubes nommés avec un protocole personnalisé. Si quelqu'un sait si cela est possible et peut me diriger dans la bonne direction, je l'apprécierais grandement. – Chris