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.
Anlayışınız mükemmel,% 100 doğrudur. –
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. –
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 –