2015-08-08 15 views
17

Bir kaç kez, genellikle doğru olup olmadığına dair bazı tartışmalarda, async/beklemeyi anladım. Anlayışımı onaylayan ya da reddeden bir kişi varsa ve yanlış anlaşılmaları engellemek için yanlış anlaşılmaları giderirse gerçekten çok memnun olurum.Async/beklemeyi anlama, nasıl çalışır ve faydaları, doğru mu?

Yüksek Düzey anlama

async/await asenkron kod yazarken geri arama cehennem kaçınmanın bir yoludur. Eşzamansız bir yöntemi yürüten bir iş parçacığı, bir await ile karşılaştığında iş parçacığı havuzuna dönecek ve beklenen işlem tamamlandığında yürütmeyi teslim alacaktır.

Düşük düzey tam zamanında korunmuş yöntemin durumuna sahip bir yöntem haline yeniden girişe izin verir, await nokta etrafında ayrı parçaya bir asenkron yöntemleri bölecek

anlaşılması. Kapakların altında bu bir çeşit durum makinesi içerir. Eşzamanlılık

async/await için

İlişkisi eşzamanlılık her türlü anlamına gelmez. async/await kullanılarak yazılan bir uygulama, tüm avantajlara rağmen node.js'nin geri aramalarda olduğu gibi tamamen tek bir şekilde işlenebiliyordu. Node.js'den farklı olarak, .NET, async/await'a sahip olmanız nedeniyle çok iş parçacıklı olduğundan, birden fazla yürütme iş parçacığına sahipken, geri çağrıları kullanmadan engellemeden gelen IO'nun avantajlarını elde edersiniz.

async/await IO tamamlamak için beklerken başka şeyler yapmak için vidaları söker Faydalar. Aynı zamanda, birden çok iş parçacığı üzerinde CPU bağlı çalışmayı veya UI iş parçacığı kapalı yapmak için TPL ile birlikte kullanılabilir. engellenmeyen IO faydalanmak için

, asenkron yöntemler API üstüne inşa edilmesi gerekmektedir aslında sonuçta işletim sistemi tarafından sağlanmaktadır engellenmeyen IO yararlanmak bu.

Kötüye

Bu benim anlayış içinde çekişme büyük noktasıdır. Bir çok kişi, bir Task numaralı telefondan bir engelleme işlemini sarmanın ve async/await'un bir performans artışı getireceğine inanıyor. Bir işlemi işlemek için ek bir iş parçacığı oluşturarak, orijinal iş parçacığını iş parçacığı havuzuna döndürmek ve sonra görev tamamlandıktan sonra özgün yöntemi sürdürmek, diğer tüm işlem yapmak için iş parçacığını boş bırakırken, gereksiz tüm bağlam anahtarlarıdır. Bu, TPL olduğu kadar async/await'un kötüye kullanımı olmasa da, bu zihniyet, async/await yanlış anlaşılmasından kaynaklanıyor gibi görünmektedir.

+1

Anlayışınız mükemmel,% 100 doğrudur. –

+2

Durum makinesini oluşturan jitterden ziyade derleyici; Aşağıdaki seviyede “beklemek” diye bir şey yoktur. ILSpy veya benzerlerini kullanırsanız üretilen sınıfları inceleyebilirsiniz. –

+0

Kötüye kullanım hakkında: iş parçacığınızın başka bir işi yoksa, gerçekten iş parçanıza izin vermelisiniz. Eğer iş parçacığınızın yapmak için başka anlamlı şeyler varsa, örneğin UI'nizi duyarlı tutun, o zaman ağır iş yapmak için akıllıca ayrı bir görev –

cevap

13

Bu oldukça doğru. olsa

birkaç not:

  • bir zaman uyumsuz yöntemin uygulanması ya da olmayabilir, bir ThreadPool iplik olabilir arayanın iplik başlar iplik.
  • Bir beklemeye ulaşılır, ancak (genellikle Task) zaten beklenirse iş parçacığı, yöntemin geri kalanını eşzamanlı olarak yürütmeye devam edecektir.
  • Yöntemi çalıştıran özüm genellikle ThreadPool iş parçacığıdır, ancak bu SyncrhonizationContext ve TaskScheduler'a bağlıdır. JIT burada yer almaz (normalden fazla değil). Derleyici, async yöntemini durum makinesine dönüştüren kişidir. Bunu this TryRoslyn example ile görebilirsiniz.
  • Beklenmedik beklemenin, tek bir iş parçacığı olabileceğinden eşzamanlılık anlamına gelmediği doğrudur. Bununla birlikte, aynı anda birden fazla senkronize olmayan işlemi başlatmak ve beklemek suretiyle tek bir iş parçacığıyla bile eşzamanlı olabilir.
  • async-bekleyin ve TPL tamamen ayrı parçalar değildir. asenkron-bekletme TPL üstünde inşa edilmiştir. Bu yüzden Görev tabanlı Asenkron Model olarak adlandırılır.
  • Gerçekten eşzamansız işlemler çoğu zaman G/Ç'yken, hepsi değil. Ayrıca, genellikle Task.Delay ile eşzamansız olarak geciktirirsiniz veya SemaphoreSlim.WaitAsync gibi eşzamansız senkronizasyon yapılarını kullanırsınız.
+1

Wow, büyük cevap. Bir şeyi açıklayabilir misiniz? "Aynı anda birden fazla senkronize olmayan işlemi başlatıp bekleyerek yalnızca tek bir iş parçacığıyla bile eşzamanlı olabilir." Bu nasıl olabilir? .NET çalışma zamanının dışında oluşturulan iş parçacıkları var mı? –

+1

@ w.brian "eşzamanlı" burada çok iş parçacıklı anlamına gelmez. Aynı anda birden fazla işlemin yapılması anlamına gelir (diğer bir deyişle). Şimdi, işlemleriniz eşzamansızsa ve bu yüzden bir iş parçacığı gerektirmiyorsa, yalnızca tek bir iş parçacığıyla eşzamanlı işlemlere sahip olabilirsiniz. http://stackoverflow.com/a/10495458/885318 – i3arnon

+1

@ w.brian, tek bir iş parçacığının eşzamanlı olarak I/O donanımı seviyesindedir - tek bir iş parçacığı birden fazla G/Ç işlemlerini başlatabilir (ve bekleyebilir). eşzamanlı modda, her birini diğerine geçmeden önce bitmesi (bloke ederken) beklemesi gerekecektir. –

İlgili konular