ValueTask<T>
bir alt küme değil Task<T>
, bir üst kümedir .
ValueTask<T>
bir T ve a'nın ayrımcı bir birleşimidir Task<T>
, bu da ReadAsync<T>
onu sahip olduğu bir T değerini eşzamanlı olarak döndürmek için tahsissiz hale getirir (kullanmanın aksine Task.FromResult<T>
, bir Task<T>
örnek tahsis etmesi gerekir ). ValueTask<T>
beklenmektedir, bu nedenle çoğu örnek tüketimi a ile ayırt edilemez olacaktır Task<T>
.
Bir yapı olan ValueTask, API tutarlılığından ödün vermeden eşzamanlı olarak çalıştıklarında bellek ayırmayan zaman uyumsuz yöntemlerin yazılmasını sağlar. Görev döndürme yöntemiyle bir arayüze sahip olduğunuzu düşünün. Bu arabirimi uygulayan her sınıf, eşzamanlı olarak yürütülseler bile bir Görev döndürmelidir (umarım Görev.FromResult'u kullanarak). Tabii ki arayüzde 2 farklı yöntem, senkronize ve senkronize olmayan bir yöntem olabilir ancak bu, “eşzamansız senkronizasyon” ve “eşzamanlı senkronize olmayan” durumlardan kaçınmak için 2 farklı uygulama gerektirir.
Böylece, her biri için başka bir şekilde özdeş bir yöntem yazmak yerine, eşzamansız veya eşzamanlı bir yöntem yazmanıza izin verir. Kullandığınız herhangi bir yerde kullanabilirsiniz, Task<T>
ancak çoğu zaman hiçbir şey eklemez.
Şey, bir şey ekler: Arayana yöntemin aslında ek işlevler kullandığına dair ima edilen bir söz ekler ValueTask<T>
. Ben şahsen, arayan kişiye mümkün olduğunca bilgi veren parametre ve dönüş türlerini seçmeyi tercih ederim. IList<T>
Numaralandırma bir sayı sağlayamıyorsa geri dönmeyin; IEnumerable<T>
Eğer geri dönmeyin. Tüketicileriniz hangi yöntemlerinizin eşzamanlı olarak çağırılabileceğini ve hangilerinin eşzamanlı olarak çağrılamayacağını bilmek için herhangi bir belge aramak zorunda kalmamalıdır.
Gelecekteki tasarım değişikliklerini orada ikna edici bir argüman olarak görmüyorum. Aksine: Bazen bir yöntem anlambilim değiştirirse, o gerektiğini kendisine tüm aramalar buna göre güncellenir kadar yapı bölünürler. Bu istenmeyen olarak kabul edilirse (ve inan bana, yapıyı kırmama arzusuna sempati duyuyorsam), arayüz versiyonlamasını düşünün.
Esasen güçlü yazmanın amacı budur.
Mağazanızda zaman uyumsuz yöntemler tasarlayan bazı programcılar bilinçli kararlar alamıyorsa, daha az deneyimli programcıların her birine kıdemli bir mentor atamak ve haftalık kod incelemesi yapmak yardımcı olabilir. Yanlış tahmin ederse, bunun neden farklı yapılması gerektiğini açıklayın. Üst düzey çocuklar için yükü, ancak gençleri sadece derin uca atmak ve takip etmeleri için keyfi bir kural vermek yerine çok daha hızlı hızlandıracak.
Yöntemi yazan adam eşzamanlı olarak çağrılabilir mi bilmiyorsa , Dünya'da kim yapar ?!
Zaman uyumsuz yöntemler yazan birçok deneyimsiz programcıya sahipseniz, aynı insanlar onları da çağırıyor mu? Hangilerinin asenkron olarak adlandırılması güvenli olduğunu kendileri anlamaya uygunlar mı yoksa bunları nasıl adlandırdıklarına benzer şekilde keyfi bir kural uygulamaya başlayacaklar mı?
Buradaki sorun geri dönüş türleriniz değil, programcılar için hazır olmadıkları rollere sokuluyor. Bunun bir sebepten dolayı olması gerekirdi, bu yüzden düzeltmenin önemsiz olacağına eminim. Bunu tanımlamak kesinlikle bir çözüm değildir. Ancak derleyiciyi aşarak sorunu gizlemek için bir yol aramak da bir çözüm değildir.
ValueTask<T>
olan işlemler için somutlaşmıyor (tahsisleri açısından) aslında (bu durumda çünkü asenkronValueTask<T>
hala yığın ayırma gerekecek).Task<T>
Kütüphaneler içinde başka desteklerin de olması sorunu var .