2014-11-11 33 views
5

Şu anda bir java arka planından C# öğreniyorum. Ayaklarımı ıslatmak için basit bir SMTP posta uygulaması yapmaya karar verdim. Ve çok hızlı öğrendim ki C#, Eşzamanlı ve Eşzamansız soketler için destek sunuyor. Görebildiğim kadarıyla TCP soket bağlantısında eşzamansız ve eşzamansız Avantajı

, ikincisi engellemez ve bunun yeni bir konuyu her seferinde oluşturmanızı gerektirmediğinden, asenkron vs eşzamanlı bir soket kullanarak için gerçek bir avantaj yoktur. Ayrıca, birini veya diğerini kullanmanın fark edilebilir bir yükü yok gibi gözüküyor.

Benim soru bir avantaj eşzamanlı bir soket kullanan orada yoksa çoğu durumda sadece asenkron ile sopa daha iyidir, bu nedir?

+1

, seni asenkron kullanmak istiyorsunuz vakaların% 99'unda demek ve olacağını e-posta kesin göndermek ve o kod bloğu bitmiş olmasıdır emin olmak için nadir% 1 senkronize olarak ve bundan sonra programa devam edin. Ayrıca bu döküm için kendi iş parçacığınızı yaparsanız, senkronize de kullanabilirsiniz. – Vajura

+0

Durumun böyle olduğunu varsaydım. Ama aynı şeyi muhtemelen asenkron olarak da yapabileceğinizi düşündüm. Yoksa yanılıyor muyum? –

+2

@MuhammadHijazi Yapabilirsin, haklısın. Funcationally, async veya sync soketleri kullanmak arasında ** hayır ** fark var. – dcastro

cevap

6

Ya mekanizma çalışacaktır. Asıl fark, senkronize olmanın, ya diğer yararlı şeyleri yapacak bir ipliği bloke etmesini ya da her bir bağlantıya bir iplik ayırmasını ima etmesidir. Her iki şekilde de, bu çok iyi ölçeklendirilmez. Basit ya da tek bir aktif bağlantıya sahip basit uygulamalar için sorun olmayabilir.

Ama eşzamanlı bağlantı herhangi önemli sayıda işlemek için gereken herhangi bir senaryo için

, asenkron API'leri yeterli performansı sağlayan bir kaç olanlardır. Ayrıca, herhangi bir etkileşimli senaryoda (yani, kullanıcı girişi ve çıkışı ile uğraşmak zorunda olduğunuz), asenkronize yaklaşım, kullanıcı arayüzü ile daha kolay entegre edilir. Bu özellikle şu anda C# async ve await var.

+0

Doğru bir uygulama için senkronize API'lerin dinleyici soketi için bir iş parçacığı ve istemci bağlantısı başına * iki * iş parçacığı olduğunu unutmayın. –

+0

Bu, uygulama protokolüne bağlıdır. Basit istek/cevap protokolleri eşzamanlı olarak alma ve gönderme gerektirmez ve tek bir iş parçacığıyla ele alınabilir. –

+0

Sadece her şey mükemmelse. Bir "basit" istek/yanıt protokolü, en az bir zamanlayıcıyı kurtarmak için gereken yarı açık bir koşulu algılayamaz. –

5

Async IO iş parçacığı kaydeder. Bir iş parçacığı (genellikle) 1MB yığın bellek tüketir. Eşzamanlı IO operasyonlarının sayısı arttığında asenkron IO'nun kullanılmasının temel nedeni budur. Ölçümlerime göre, binlerce iş parçacığına ulaşana kadar işletim sistemi ölçeklenebilirliği bir sorun değil.

ana dezavantajı

o güvenilirlik aynı seviyede aynı uygulama işi yapmak için daha fazla geliştirme çabası gerektirir olmasıdır. Ayrıca

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

Her zaman IO zaman uyumsuz kullanmak tavsiye objektif yanlış tavsiyedir. Her duruma bağlıdır