Ben de aynı soruyu aklımdan çıkardım, ancak cevapları okuduktan sonra, sorunun “kaputun altındaki sihir” e atıfta bulunarak şaşırdığı görülüyor.
Yukarıda belirtilen Asenkron Programlama'dan :
asyncAnahtar kelime kullanmak sağlayan bir zaman uyumsuz yönteminin, içine bir yöntem döner awaitkendi bünyesinde anahtar kelime.
- Ne zaman
awaitanahtar kelime uygulanır, aramadan yöntemi askıya alır ve beklenen görev tamamlanana kadar verimleri onun arayan kişiye geri kontrol eder.
awaitsadece bir asyncyöntem içinde kullanılabilir .
Karşılaşılan bağlam awaitengelleniyor mu?
- Evet . Bu esasen, yürütme bağlamında bilinen bir durumu korumak için yerel bir senkronizasyon engeli; Ancak, varsa diğer bağlamlar birleştirilmez.
Uygulamanın geri kalanı, adresinde engelliyor awaitmu?
Başvurunuzun nasıl yazıldığına bağlıdır . awaitAynı bağlamda art arda başlatılan bir dizi ed ed görev dizisi ise (bakınız: Bazı async / await davranışını anlamaya çalışmak )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
bu şekilde her awaitbiri bir sonrakinin yumurtlamasını engeller.
Öte yandan, paralel olarak başlatılan aynı bağımlı görevler paralel olarak yürütülür ve bağlam yalnızca yanıtı engeller. await:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
Genel olarak, awaitverim, mevcut bağlamın çağrıldığı yerden dış bağlama uygulanır. Bununla birlikte, dış bağlamın kendisi akımı bekliyorsa await, aynı bağlamdaki sıralı bir s gibidir .
Bu nedenle, asyncfaydalardan yararlanmak için, uygulamanın birkaç paralel bağlamda (UI, data-client vb.) Çalışacak şekilde tasarlanması gerekir, daha sonra awaitbir bağlamda diğer bağlamlarda yürütme sağlar, böylece tüm uygulama bir bireyi bloke etmez await.