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 AsyncVisual 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 Taskveya 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 asynceşzamansızdır ve sonra bir Taskveya 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 Asynceki kongre yöntemi awaitable olan API kullanıcıya iletişim kurmaktır. Bir yöntemin beklenebilir olması Taskiç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 Asyncsonek 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 Taskihtiyaç 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 Asyncyöntemlere eklemeniz gerekir asyncve bu dönüş Taskveya 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 voidistediyseniz, o zaman eklemeniz Asyncönerilir. async voidOlay 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 Asyncbir de async void, muhtemelen bir çevirmek gerekir async Tasksonra ekleme arayanlar bunu bekliyor böylece Async.