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 :
async
Anahtar kelime kullanmak sağlayan bir zaman uyumsuz yönteminin, içine bir yöntem döner await
kendi bünyesinde anahtar kelime.
- Ne zaman
await
anahtar kelime uygulanır, aramadan yöntemi askıya alır ve beklenen görev tamamlanana kadar verimleri onun arayan kişiye geri kontrol eder.
await
sadece bir async
yöntem içinde kullanılabilir .
Karşılaşılan bağlam await
engelleniyor 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 await
mu?
Başvurunuzun nasıl yazıldığına bağlıdır . await
Aynı 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 await
biri 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, await
verim, 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, async
faydalardan yararlanmak için, uygulamanın birkaç paralel bağlamda (UI, data-client vb.) Çalışacak şekilde tasarlanması gerekir, daha sonra await
bir bağlamda diğer bağlamlarda yürütme sağlar, böylece tüm uygulama bir bireyi bloke etmez await
.