SLaks ve Killercam'ın cevapları iyi; Biraz daha içerik ekleyeceğimi düşündüm.
İlk sorunuz esas olarak hangi yöntemlerin işaretlenebileceğiyle ilgilidir async
.
Olarak işaretlenmiş bir yöntem async
dönebilir void
, Task
ya da Task<T>
. Aralarındaki farklar nelerdir?
Bir Task<T>
dönen zaman uyumsuz yöntem beklenen edilebilir ve görev tamamlandığında bir T. yukarı buyruğu olacak
Bir Task
dönen zaman uyumsuz yöntem beklenen edilebilir ve görev tamamlamalar, görevin devamı çalıştırmak üzere programlandığı.
Bir void
dönen uyumsuz yöntemi beklenilemeyecek; bu bir "ateş et ve unut" yöntemidir. Zaman uyumsuz olarak çalışır ve ne zaman bittiğini söylemenizin hiçbir yolu yoktur. Bu biraz tuhaf olmaktan çok daha fazlası; SLaks'ın dediği gibi, normalde bunu yalnızca zaman uyumsuz bir olay işleyicisi yaparken yaparsınız. Olay tetiklenir, işleyici çalıştırır; hiç kimse olay işleyicisi tarafından döndürülen görevi "beklemeyecektir" çünkü olay işleyicileri görevleri döndürmez ve dönseler bile, Görev'i bir şey için hangi kod kullanır? Genellikle kontrolü ilk etapta işleyiciye aktaran kullanıcı kodu değildir.
Bir yorumdaki ikinci sorunuz, esasen nelerin await
öğrenilebileceğiyle ilgilidir:
Ne tür yöntemler geliştirilebilir await
? Boşluk döndürme yöntemi kullanılabilir await
mi?
Hayır, boşluk döndürme yöntemi beklenemez. Derleyici , bir örnek yöntemi veya bir uzantı yöntemi olabilen await M()
bir çağrıya çevirir . Beklenen değer, sizi bekleyen bir değer olmalıdır; Açıkça bir boşluk döndürme yöntemi, sizi bekleyen bir değer elde edebileceğiniz bir değer üretmez.M().GetAwaiter()
GetAwaiter
Task
-dönüş yöntemleri, beklenebilir değerler üretebilir. Üçüncü şahısların, beklenebilecek Task
nesneye benzer kendi uygulamalarını yaratmak isteyeceklerini ve siz de onları bekleyebileceğinizi tahmin ediyoruz. Ancak, beyan izin verilmeyecektir async
dönüş şey ama bu yöntemler void
, Task
ya Task<T>
.
(GÜNCELLEME: Son cümlem, C # 'ın gelecekteki bir sürümü tarafından tahrif edilmiş olabilir; zaman uyumsuz yöntemler için görev türleri dışında dönüş türlerine izin veren bir teklif var.)
(GÜNCELLEME: Yukarıda bahsedilen özellik C # 7'ye girdi.)