2010-03-01 5 views
5

Ich habe überall im Internet gesucht, aber ich kann keine Antwort auf die folgende Frage finden.Abbrechen NamedPipeClientStream.Read Anruf

Ich habe eine C# /. NET NamedPipeClientStream-Instanz in einem Client-Programm, und ein Arbeitsthread ruft NamedPipeClientStream.Read (Byte [], Int, Int), um Daten von einem Server abzurufen. Der Server sendet Datenaktualisierungen an den Client.

Lesen ist ein blockierender Anruf. Wenn ich den Client schließen möchte, gibt es eine Möglichkeit, den Read-Aufruf abzubrechen/zu beenden? Ich habe versucht, Close auf der Named Pipe-Instanz aufzurufen, hat aber keine Auswirkung auf den Thread, der Read aufgerufen hat.

Ich würde denken, dass es eine Möglichkeit geben würde, einen Leseanruf abzubrechen. Wenn nicht, scheint es, als wäre das eine sehr schlecht gestaltete API, weil Ihr Programm der Pipe ausgeliefert ist.

Alle Informationen werden sehr geschätzt.

-Chris

Antwort

7

Verwenden Sie den NamedPipeClientStream-Konstruktor, der ein PipeOptions-Argument verwendet. Wenn Sie PipeOptions.Asynchronous angeben, wird der Aufruf Read() beendet, wenn Sie die Close() -Methode aufrufen. Die Read() - Methode gibt 0 zurück

+0

: D Du bist mein Held! Wenn die Pipe als asynchron festgelegt wird, führt dies dazu, dass ein geblockter Aufruf von Read zurückgegeben wird, wenn Close aufgerufen wird. Danke vielmals! – Chris

0

keine direkte Antwort auf Ihre Frage, aber - ich hatte vor kurzem einige NamedPipe IPC zu tun, und ich fand, dass WCF war genial. Es dauerte weniger als eine Stunde, um ein POC zu implementieren und ja, ich bin mir ziemlich sicher, dass es bedeutet auch Ihre Anfrage abzubrechen - und Sie müssen nicht in Byte-Arrays denken.

Ist das eine Option für Sie?

+1

Ich schaute WCF ein wenig und wurde wirklich aufgeregt, aber leider muss der Client, den ich entwickle, mit einem eigenen Server (C++, nicht .NET) mit seinem eigenen sprechen vordefinierte Named Pipes und Kommunikationsprotokoll. Als ich WCF sah, war ich schnell überwältigt von der Weite der Dokumentation. Ich konnte nicht schnell feststellen, ob ich WCF verwenden konnte, um mit einem vorhandenen System zu kommunizieren, das Named Pipes mit einem benutzerdefinierten Protokoll verwendet. Wenn jemand weiß, ob das möglich ist und mich in die richtige Richtung weisen kann, würde ich es sehr schätzen. – Chris