En hızlı öğrenme için ..
Yöntem yürütme akışını anlama (şema ile): 3 dakika
Soru özeleştirme (öğrenme uğruna): 1 dk
Sözdizimi şekeri hızlıca alın: 5 dakika
Bir geliştiricinin karışıklığını paylaşın: 5 dakika
Sorun: Normal kodun gerçek dünyadaki bir uygulamasını Async koduna hızla değiştirin: 2 dakika
Nerede Sonraki?
Yöntem yürütme akışını anlama (şema ile): 3 dakika
Bu resimde sadece # 6'ya odaklanın (başka bir şey yok)
6. adımda: İş bittiği için uygulama burada durdu. Devam etmek için getStringTask (bir tür işlev) sonucuna ihtiyaç var. Bu nedenle, await
ilerlemesini askıya almak ve arayan kişiye (içinde bulunduğumuz bu yöntemin) kontrolü (verim) vermek için bir operatör kullanır . GetStringTask için gerçek çağrı # 2'nin başlarında yapıldı. # 2'de bir dize sonucu döndürmek için bir söz verildi. Ama sonucu ne zaman döndürecek? (# 1: AccessTheWebAsync) tekrar 2. bir çağrı yapmalı mıyız? Sonucu kim alır, # 2 (çağrı bildirimi) veya # 6 (bekleyen ifade)
AccessTheWebAsync () harici arayan da şimdi bekliyor. Bu yüzden arayan AccessTheWebAsync bekliyor ve AccessTheWebAsync şu anda GetStringAsync bekliyor. İlginç olan şey AccessTheWebAsync beklemeden önce biraz çalışma yaptı (# 4) belki de bekleme zamanından tasarruf etmek için. Harici görevli (ve zincirdeki tüm arayanlar) için aynı anda çoklu görev yapma özgürlüğü de mevcuttur ve bu 'asenkron' şeyin en büyük artısıdır! Eşzamanlı gibi hissediyorsunuz ... ya da normal ama değil.
Unutmayın, yöntem zaten iade edildi (# 2), tekrar geri dönemez (ikinci kez yok). Peki arayan kişi nasıl bilecek? Her şey Görevlerle ilgili! Görev kabul edildi. Görev beklendi (yöntem değil, değer değil). Değer Görev'de ayarlanır. Görev durumu tamamlanacak şekilde ayarlanacak. Arayan sadece Görev (# 6) 'yı izler. Yani 6 # sonucu nereden / kimin alacağının cevabıdır. Daha sonra okumak için burada .
Soru aşkına iç gözlem: 1 dk
Soruyu biraz ayarlayalım:
Nasıl ve ne zaman kullanılır? Ve ? async
await
Tasks
Çünkü öğrenme Task
otomatik olarak diğer ikisini kapsar (ve sorunuzu cevaplar)
Sözdizimi şekeri hızlıca alın: 5 dakika
Dönüştürmeden önce (orijinal yöntem)
internal static int Method(int arg0, int arg1)
{
int result = arg0 + arg1;
IO(); // Do some long running IO.
return result;
}
Yukarıdaki yöntemi çağırmak için Görev-ified yöntemi
internal static Task<int> MethodTask(int arg0, int arg1)
{
Task<int> task = new Task<int>(() => Method(arg0, arg1));
task.Start(); // Hot task (started task) should always be returned.
return task;
}
Bekliyor muyuz yoksa zaman uyumsuz mu? Hayır. Yukarıdaki yöntemi çağırın ve izleyebileceğiniz bir görev alırsınız. Görevin ne döndürdüğünü zaten biliyorsunuz .. bir tamsayı.
Bir Görevi çağırmak biraz zor ve o zaman anahtar kelimeler görünmeye başlar. MethodTask () öğesini çağıralım
internal static async Task<int> MethodAsync(int arg0, int arg1)
{
int result = await HelperMethods.MethodTask(arg0, arg1);
return result;
}
Yukarıdaki aynı kod aşağıdaki resim olarak eklendi:
- İşin bitmesini 'bekliyoruz'. Dolayısıyla
await
- Bekliyoruz, kullanmalıyız
async
(zorunlu sözdizimi)
- Ön
Async
ek olarak MethodAsync (kodlama standardı)
await
anlaşılması kolaydır, ancak kalan iki ( async
, Async
) :) olmayabilir. Eh, sonrası için okur though.Further derleyiciye bir çok daha mantıklı olmalıdır burada
Yani 2 bölüm var.
- 'Görev' oluştur
- Görevi çağırmak için sözdizimsel şeker oluşturun (
await+async
)
Unutmayın, AccessTheWebAsync () için harici bir arayanımız vardı ve bu arayan da korunmuyor ... yani aynı ihtiyacı var await+async
. Ve zincir devam ediyor. Ama her zaman Task
bir ucunda bir olacak.
Tamam, ama bir geliştirici # 1'in (Görev) eksik olduğunu görünce şaşırdı ...
Bir geliştiricinin karışıklığını paylaşın: 5 dakika
Bir geliştirici uygulama yapmama hatası yaptı Task
ama hala çalışıyor! Soruyu ve burada verilen kabul edilen cevabı anlamaya çalışın . Umarım okudunuz ve tamamen anladınız. Özet 'Görev'i göremeyebileceğimiz / uygulayamayacağımız, ancak üst sınıfta bir yerde uygulandığımızdır. Benzer şekilde, zaten inşa edilmiş bir örneği çağırmak MethodAsync()
, bu yöntemi Task
( MethodTask()
) kendimizle uygulamaktan çok daha kolaydır . Çoğu geliştirici, Tasks
bir kodu Eşzamansız olana dönüştürürken başını bulmakta zorlanır .
İpucu: Zorluğu dışa aktarmak için mevcut bir Async uygulamasını ( MethodAsync
veya gibi ToListAsync
) bulmaya çalışın . Bu yüzden sadece Async ile uğraşmamız ve beklememiz gerekiyor (bu kolay ve normal koda oldukça benzer)
Sorun: Normal kodun gerçek dünyadaki uygulamasını Async işlemine hızlıca değiştirin: 2 dakika
Veri Katmanı'nda aşağıda gösterilen kod satırı kesilmeye başlandı (birçok yer). Çünkü bazı kodlarımızı .Net framework 4.2. * 'Dan .Net core' a güncelledik. Biz uygulamanın her yerinde 1 saat içinde düzeltmek zorunda kaldı!
var myContract = query.Where(c => c.ContractID == _contractID).First();
çantada keklik!
- EnteryaFramework nuget paketini QueryableExtensions olduğundan kurduk. Ya da başka bir deyişle, Async uygulamasını (görev) yapar, böylece basit
Async
ve await
kodla hayatta kalabiliriz .
- namespace = Microsoft.EntityFrameworkCore
çağıran kod satırı böyle değişti
var myContract = await query.Where(c => c.ContractID == _contractID).FirstAsync();
Yöntem imzası değiştirildi
Contract GetContract(int contractnumber)
için
async Task<Contract> GetContractAsync(int contractnumber)
çağrı yöntemi de etkilendi: GetContractAsync(123456);
olarak adlandırıldıGetContractAsync(123456).Result;
Biz her yerde 30 dakika içinde değişti!
Ancak mimar bize EntityFramework kütüphanesini bunun için kullanmamamızı söyledi! ayy! dram! Sonra özel bir Görev uygulaması yaptık (yuk). Hangisini biliyorsun. Hala kolay! ..still yuk ..
Nerede Sonraki? ASP.Net Core'da Senkronize Çağrıları Asenkronize Dönüştürme
hakkında izleyebileceğimiz harika bir hızlı video var , belki de bu muhtemelen bunu okuduktan sonra gidecek yön.