2014-11-11 11 views
5

Attualmente sto imparando C# da uno sfondo java. Per bagnarmi i piedi ho deciso di creare una semplice applicazione di posta SMTP. E ho imparato molto rapidamente che C# offre supporto per socket sincroni e asincroni.Vantaggio della connessione socket sincrona vs asincrona TCP

Da quello che posso vedere, non vi è alcun reale vantaggio nell'usare un socket sincrono rispetto a un asincrono poiché quest'ultimo non blocca e quindi non richiede di creare ogni volta un nuovo thread. Inoltre, non sembra che ci sia un notevole overhead nell'usare l'uno o l'altro.

Quindi la mia domanda è questa, c'è un vantaggio nell'usare un socket sincrono o è meglio restare semplicemente asincroni nella maggior parte dei casi?

+1

Tutto dipende dalla situazione, direi nel 99% dei casi che useresti asincrono e nel raro 1% sincrono dove vuoi assicurarti che l'email sia spedita di sicuro e che quel blocco di codice sia finito e continua con il programma dopo. Inoltre, se crei i tuoi thread per questo scopo utilizzerai anche sincrono. – Vajura

+0

Ho pensato che fosse il caso. Ma ho anche immaginato che probabilmente potresti fare la stessa cosa anche con asincrono. O mi sbaglio? –

+2

@MuhammadHijazi Puoi, hai ragione. In pratica, c'è ** nessuna ** differenza tra l'uso di socket asincroni o di sincronizzazione di sorta. – dcastro

risposta

6

Entrambi i meccanismi funzioneranno. La differenza principale è che synchronous implica il blocco di un thread che altrimenti farebbe altre cose utili o dedicare un thread a ciascuna connessione. Ad ogni modo, questo non ha una scala molto buona. Per le applicazioni semplici con pochi o solo una connessione attiva, potrebbe andare bene.

Ma per qualsiasi scenario in cui è necessario gestire un numero significativo di connessioni simultanee, le API asincrone sono le uniche che forniscono prestazioni adeguate. Inoltre, in qualsiasi scenario interattivo (vale a dire dove devi gestire input e output dell'utente), l'approccio asincrono è più facilmente integrato con l'interfaccia utente. Questo è particolarmente vero ora che abbiamo async e await in C#.

+0

Si noti che per un'implementazione corretta, le API sincrone implicano un thread per il socket listener e * due * thread per connessione client. –

+0

Dipende dal protocollo dell'applicazione. Semplici protocolli di richiesta/risposta non richiedono ricezione e invio simultanei e possono essere gestiti in un singolo thread. –

+0

Solo se tutto è perfetto. Un protocollo di richiesta/risposta "semplice" non è in grado di rilevare una condizione semiaperta, richiedendo almeno un timer per il ripristino. –

5

Async IO salva i thread. Un thread consuma (solitamente) 1 MB di memoria di stack. Questo è il motivo principale per utilizzare IO asincrono quando il numero di operazioni IO in sospeso simultanee diventa grande. Secondo le mie misurazioni, la scalabilità del sistema operativo non è una preoccupazione finché non si entra nelle migliaia di thread.

Lo svantaggio principale è che richiede un maggiore sforzo di sviluppo per far funzionare la stessa applicazione allo stesso livello di affidabilità.

I have written about this tradeoff at length. anche: Should we switch to use async I/O by default?

Si tratta di consigli oggettivamente sbagliato a consigliare di usare sempre async IO.

Problemi correlati