Microsoft belgelerinde bile gerçeğin belirsiz olduğunu düşünüyorum:
Visual Studio 2012 ve .NET Framework 4.5 ile atfedilir herhangi yöntemde async
(anahtar kelime Async
Visual Basic) bir asenkron metot olarak kabul ve C # ve Visual Basic derleyiciler gerekli dönüşümleri TAP kullanarak zaman uyumsuz yöntemini uygulamak yerine edilmektedir. Zaman uyumsuz bir yöntem, bir Task
veya bir Task<TResult>
nesne döndürmelidir .
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
Bu zaten doğru değil. İle herhangi bir yöntem async
eşzamansızdır ve sonra bir Task
veya Task<T>
- döndürmesi gerektiğini söyler - bu, bir çağrı yığınının üstündeki yöntemler için doğru değildir, örneğin Button_Click, veya async void
.
Elbette, kongrenin amacının ne olduğunu düşünmek zorundasın?
Bunu söyleyebiliriz Async
eki kongre yöntemi awaitable olan API kullanıcıya iletişim kurmaktır. Bir yöntemin beklenebilir olması Task
için, bir boşluk Task<T>
için veya bir değer döndürme yöntemi için geri dönmesi gerekir ; bu, yalnızca ikincisine son eklenebileceği anlamına gelir Async
.
Veya Async
sonek kuralının, yöntemin hemen geri dönebileceğini, diğer işleri yapmak için mevcut iş parçacığını bırakıp potansiyel olarak yarışlara neden olabileceğini bildirmek olduğunu söyleyebilirsiniz .
Bu Microsoft doc alıntı diyor ki:
Kural olarak, Zaman uyumsuz veya zaman uyumsuz değiştiriciye sahip yöntemlerin adlarına "Zaman uyumsuz" eklersiniz.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Bu, kendi asenkron yöntemlerin geri dönen son eke Task
ihtiyaç duyduğundan bahsetmiyor bile Async
, sanırım hepimiz bunu yaptıklarında hemfikiriz.
Yani bu sorunun cevabı şunlar olabilir: ikisi de. Her iki durumda da, anahtar kelimeli Async
yöntemlere eklemeniz gerekir async
ve bu dönüş Task
veya Task<T>
.
Stephen Toub'dan durumu açıklamasını isteyeceğim.
Güncelleme
Ben de yaptım. Ve işte iyi adamımızın yazdığı:
Genel bir yöntem Görev döndürüyorsa ve doğası gereği zaman uyumsuzsa (her zaman tamamlanana kadar eşzamanlı olarak yürütüldüğü bilinen ancak yine de herhangi bir nedenle bir Görev döndüren bir yöntemin aksine), bir "Zaman uyumsuz" sonekine sahip olmalıdır. Kılavuz budur. Buradaki adlandırma ile birincil amaç, bir tüketiciye, çağrılan yöntemin muhtemelen tüm çalışmasını eşzamanlı olarak tamamlamayacağını çok açık hale getirmektir; elbette, işlevselliğin hem eşzamanlı hem de eşzamansız yöntemlerle ortaya çıktığı durumda, onları ayırt etmek için bir ad farkına ihtiyaç duyduğunuzda yardımcı olur. Yöntemin zaman uyumsuz uygulamasını nasıl başardığı, adlandırma için önemsizdir: derleyicinin yardımını toplamak için zaman uyumsuz / beklemenin kullanılıp kullanılmadığı veya System.Threading.Tasks'ten türlerin ve yöntemlerin doğrudan kullanılıp kullanılmadığı (örn. g. TaskCompletionSource), yöntemin tüketicisi söz konusu olduğunda yöntemin imzasını etkilemediği için gerçekten önemli değildir.
Tabii ki, bir kılavuzun her zaman istisnaları vardır. Adlandırma durumunda en dikkate değer olanı, tüm bir türün varoluş nedeninin eşzamansız odaklı işlevsellik sağlamak olduğu durumlar olacaktır; bu durumda, her yöntemde Async'e sahip olmak aşırı olacaktır, örneğin, diğer Görevleri üreten Görevin kendisindeki yöntemler .
Boşluk geri dönüşlü eşzamansız yöntemlere gelince, arayan kişinin eşzamansız çalışmanın ne zaman tamamlandığını bilmesinin iyi bir yolu olmadığından, bunların kamuya açık yüzey alanında olması arzu edilmez. Boşluk döndüren bir eşzamansız yöntemi herkese açık olarak ifşa etmeniz gerekiyorsa, büyük olasılıkla eşzamansız çalışmanın başlatıldığını bildiren bir ada sahip olmak istersiniz ve mantıklıysa burada "Eşzamansız" sonekini kullanabilirsiniz. Bu davanın ne kadar nadir olması gerektiği göz önüne alındığında, bunun gerçekten duruma göre bir karar olduğunu düşünüyorum.
Umarım yardımcı olur Steve
Stephen'ın açılış cümlesindeki kısa ve öz rehber yeterince açık. Hariç tutuyor async void
çünkü böyle bir tasarıma sahip genel bir API yaratmak istemenin olağandışı bir durumdur çünkü zaman uyumsuz bir boşluğu uygulamanın doğru yolu düz bir Task
örnek döndürmek ve derleyicinin büyüsüne izin vermektir. Ancak, eğer a public async void
istediyseniz, o zaman eklemeniz Async
önerilir. async void
Olay işleyicileri gibi diğer yığın üstü yöntemler genellikle herkese açık değildir ve önemli değildir / nitelendirilmez.
Benim için kendimi son eklemeli merak bulursanız söylüyor Async
bir de async void
, muhtemelen bir çevirmek gerekir async Task
sonra ekleme arayanlar bunu bekliyor böylece Async
.