2009-11-03 6 views
6

Sto solo provando a programmare un socket, usando socket non bloccanti in C#. I vari esempi che ho trovato, come ad esempio this, sembrano utilizzare un ciclo while (true), ma questo approccio fa scoppiare la cpu al 100%. C'è un modo per usare socket non bloccanti usando uno stile di programmazione evento? GrazieC# socket non bloccante senza loop (vero)

risposta

6

vedere l'esempio MSDN here. L'esempio mostra come ricevere i dati in modo asincrono. È inoltre possibile utilizzare i metodi Socket BeginSend/EndSend per inviare dati in modo asincrono.

Si noti che il delegato di richiamata viene eseguito nel contesto di un thread ThreadPool. Questo è importante se i dati ricevuti all'interno del callback devono essere condivisi con un altro thread, ad esempio il thread dell'interfaccia utente principale che visualizza i dati in un modulo di Windows. In tal caso, sarà necessario l'accesso sincronizzato ai dati utilizzando la parola chiave lock, ad esempio.

Come hai notato, con socket non bloccanti e ciclo while, il processore è ancorato al 100%. Il modello asincrono invocherà il delegato di callback solo quando ci sono dati da inviare o ricevere.

3

Parlando in generale sul blocco/non-blocking IO, applicabile in generale:

La cosa fondamentale è che nella vita reale il programma fa altre cose pur non facendo IO. Gli esempi sono tutti inventati in questo modo.

Nel blocco di IO, il thread 'blocca' durante l'attesa di IO. Il sistema operativo va e fa altre cose, ad es. consente l'esecuzione di altri thread. Quindi la tua applicazione può fare molte cose (concettualmente) in parallelo usando molti thread.

In I/O non bloccante, le query sui thread per vedere se IO è possibile, e altrimenti va e fa qualcos'altro. Quindi fai molte cose in parallelo esplicitamente - a livello di applicazione - scambiandole tra loro.

+0

Questa risposta fornisce una certa teoria sul perché si vorrebbe fare un IO non bloccante, ma in realtà non risponde alla domanda del poster su come implementarlo. – squawknull

0

Socket.BeginReceive e AsyncCallback

4

Per evitare un problema di CPU durante un ciclo pesante, quando nessun dato ricevuto viene messo thread.sleep(100) o meno. Ciò consentirà ad altri processi di cambiare il proprio compito