2009-08-06 19 views
6

Ok, quindi sono un po 'confuso sul motivo per cui non riesco a trovarlo da nessuna parte, o se non esiste allora perché Microsoft non l'ha implementato?NetworkStream, c'è qualcosa di simile a DataReceived per SerialPort? (C#)

Quindi, ecco il mio scenario, ho un NetworkStream, che ha un delizioso piccolo booleano chiamato DataAvailable, e quello di cui ho bisogno è un evento, che salta fuori e dice "Ehi, ci sono dati disponibili per te!" (perché sono pigro e preferirei dire che ci sono dati disponibili che continuare a chiedere "Va bene, ci sono dati disponibili?" ancora e ancora fino a quando ottengo la risposta "In realtà, questa volta c'è").

Qualcosa di simile a SerialPort (che ha un bell'evento (DataReceived), che mi informa gentilmente che i dati vengono ricevuti dal porto) sarebbe stato bello. Ma sto usando un socket con un NetworkStream.

Indirizzare la direzione corretta se c'è qualcosa di evidentemente ovvio che mi manca, ma in caso contrario, significa che dovrò utilizzare alcune associazioni dati sulla proprietà DataAvailable e quando è impostato su true , per chiamare il mio evento/funzione "fatto in casa"? Se questo è il modo in cui potresti per favore darmi un piccolo esempio per far rotolare la palla?

Modifica
La mia risposta ideale sarebbe per qualcuno a venire insieme e spiegare a me come posso trovare/creare qualcosa di estremamente simile al DataReceived Event utilizzato con un SerialPort, ma implementato per un socket che è in streaming via un NetworkStream!

Grazie in anticipo di nuovo, apprezzato.

risposta

2

Non ci sono eventi nella classe NetworkStream (see MSDN). NetworkStream eredita da Stream, pertanto segue il modello di flusso, che non è basato sugli eventi. Se avete bisogno di ricevere dati in modo asincrono, utilizzare il metodo BeginRead

7

Giusto per chiarire risposta Thomas', con una spiegazione per chi non è familliar con il metodo BeginRead e vuole capire la risposta a questa domanda, è possibile chiamare :

AsyncCallBack MyCallBack = new AsynCallBack(DataReceived); 
networkStream.BeginRead(buffer, offset, size, MyCallBack, MyObject); 

quindi creare la funzione DataReceived:

private void DataReceived(IAsynResult result) 
    { 
    //call receive functionality 
    } 

Ciò richiederà DataReceived estremamente simile a come funziona l'evento SerialPort.DataReceived.

+5

Vale la pena sottolineare che è ancora necessario chiamare il metodo .EndRead per completare correttamente il processo di lettura e ottenere i dati. – Andy

Problemi correlati