2010-03-01 2 views
5

Mi sono guardato intorno in tutto il Web, ma non riesco a trovare una risposta alla seguente domanda.Annulla NamedPipeClientStream.Read call

Ho un'istanza NamedPipeClientStream C# /. NET in un programma client e un thread di lavoro chiama NamedPipeClientStream.Read (byte [], int, int) per ottenere dati da un server. Il server invia gli aggiornamenti dei dati al client.

Lettura è una chiamata bloccata. Se voglio chiudere il client, c'è un modo per cancellare/uscire dalla chiamata Leggi? Ho provato a chiamare Close sull'istanza named pipe, ma non ha alcun effetto sul thread che ha chiamato Read.

Penso che ci sarebbe un modo per cancellare una chiamata di lettura. In caso contrario, sembra che questa sia un'API mal progettata, perché il tuo programma è in balia della pipa.

Qualsiasi informazione è molto apprezzata.

-Chris

risposta

7

Utilizzare il costruttore NamedPipeClientStream che accetta un argomento PipeOptions. Specificare PipeOptions.Asynchronous completerà la chiamata a Read() quando si chiama il metodo Close(). Il metodo Read() restituisce 0.

+0

: D Sei il mio eroe! L'impostazione del pipe in Asincrono fa sì che una chiamata bloccata a Read ritorni quando viene chiamato Close. Molte grazie! – Chris

0

Non è una risposta diretta alla sua domanda, ma - ho dovuto fare un po 'NamedPipe IPC a poco tempo fa e ho trovato che WCF è stato fantastico. Mi ci sono voluti meno di un'ora per implementare un POC e sì, sono abbastanza sicuro che esponga i mezzi per cancellare la tua richiesta - e non devi pensare in termini di array di byte.

Questa è un'opzione per voi?

+1

Ho esaminato un po 'la WCF e ne sono stato davvero entusiasta, ma sfortunatamente il client che sto sviluppando deve parlare con un server personalizzato (C++, non .NET) con il suo pipe e protocollo di comunicazione predefiniti. Quando guardavo WCF, ero rapidamente sopraffatto dalla vastità della documentazione. Non ero in grado di determinare rapidamente se potevo usare WCF per parlare con un sistema esistente usando pipe con un protocollo personalizzato. Se qualcuno sa se questo è possibile e può indicarmi la giusta direzione, lo apprezzerei molto. – Chris