Bu soru C # diliyle ilgilidir, ancak Java veya TypeScript gibi diğer dilleri kapsamasını bekliyorum.
Microsoft , .NET'te zaman uyumsuz çağrıları kullanma konusunda en iyi uygulamaları önerir . Bu tavsiyeler arasında, iki tane seçelim:
- Eşzamansız yöntemlerin imzasını değiştirerek Görev veya Görev <> öğelerini döndürürler (TypeScript'te bir Söz <> olur)
- xxxAsync () ile bitecek async yöntemlerinin adlarını değiştirin
Şimdi, düşük seviyeli, senkronize bir komponenti bir eşzamansız olan ile değiştirirken, bu uygulamanın tam yığınını etkiler. Eşzamansız / beklemede yalnızca "tamamen kullanılırsa" olumlu bir etkiye sahip olduğu için, uygulamadaki her katmanın imzası ve yöntem adlarının değiştirilmesi gerektiği anlamına gelir.
İyi bir mimari çoğu zaman düşük seviyeli bileşenlerin başkaları tarafından değiştirilmesinin üst seviye bileşenler tarafından görülmeyeceği şekilde her bir tabaka arasına soyutlamalar yerleştirmeyi içerir. C # 'da, soyutlamalar arayüz şeklini alır. Yeni, düşük seviyeli, zaman uyumsuz bir bileşen tanıtırsak, çağrı yığınındaki her arabirimin yeni bir arabirimle değiştirilmesi veya değiştirilmesi gerekir. Bir uygulayıcı sınıfta bir problemin çözülme şekli (asenkron veya senkronize) artık arayanlara gizlenmemiş (soyutlanmış). Arayan kişinin senkronize mi, yoksa senkronize mi olmadığını bilmek zorunda.
Async / "iyi mimari" ilkelerine aykırı en iyi uygulamaları beklemiyor musunuz?
Her bir arayüzün (örneğin, IEnumerable, IDataAccessLayer demek) async muadillerine (IAsyncEnumerable, IAsyncDataAccessLayer) ihtiyacı olduğu anlamına gelir mi?
Sorunu biraz daha ileriye götürürsek, her yöntemin eşzamansız olduğunu varsaymak (bir Görev <> veya Söz <> döndürmek) ve gerçekte olmadıklarında eşzamansız çağrıları senkronize etme yöntemleri için daha kolay olmaz mıydı? zaman uyumsuz? Gelecekteki programlama dillerinden beklenen bir şey mi?
CancellationToken
, ve bir temerrüde ulaşmak isteyenler). Mevcut senkronizasyon yöntemlerini kaldırmak (ve proaktif olarak tüm kodları kırmak) açık bir başlangıç değildir.