async + await == senkronizasyon?


24

Zaman uyumsuz web istekleri yapma hakkında konuşan bu yazı üzerine tökezledi .

Şimdi, bir kenara sadelik, eğer gerçek dünyada, tek yaptığınız bir async isteği yapmak ve onu bir sonraki satırda beklemek, ilk etapta bir senkronizasyon çağrısı yapmakla aynı şey değil mi?


5
Tam olarak değil. Kodunuz, siz bir sonuç elde edene kadar hiçbir şey olmayacak şekilde senkronize olur. Ancak, altında async yöntemi geri dönene kadar üzerinde çalıştığınız iş parçacığından vazgeçtiniz, daha sonra çalışmaya devam etmesi için başka bir iş parçacığı atandı.
R0MANARMY

2
bu, ancak eşzamansız aynı anda başka bir eşzamansız da yapabilir ve daha sonra 2'yi bekler, bu mümkün değildir
çıngırak ucube

İşte C # 'daki asenkronun altında bazılarını tartışan bir makale ( tomasp.net/blog/async-compilation-internals.aspx ) - C # ve F #' da asenkron programlamayı kapsayan bir dizinin parçası.
paul

@ ratchetfreak: Evet, birden fazla arama yapıyorsanız söylemeye gerek yok.
Şef,

@ R0MANARMY: Eğer uygulamanızın diğer şeyler yapıyor, o zaman evet ve zaman uyumsuz + beklemekle mümkün kılar. Akim en iyisini söylüyor! Ancak, kodun button_click işleyicisinde veya bu konuda böyle bir işleyicide olmadığını hayal edin. Birisi, kodu kör olarak (async + bekleyen satırları) herhangi bir yönteme kopyalarsa, kodunuzun async olduğu ancak yürürlükte olamayabileceği izlenimini doğurabilir.
Şef,

Yanıtlar:


32

Hayır, devamasync + await != sync nedeniyle

MSDN 'Asenkron ve Beklemede Asenkron Programlama (C # ve Visual Basic)' den

Zaman uyumsuz yöntemlerin engellenmeyen işlemler olması amaçlanmıştır. Zaman uyumsuz bir yöntemde bir beklenen ifade, beklenen görev çalışırken geçerli diziyi engellemez. Bunun yerine, ifade yöntemin geri kalanını bir devamı olarak kaydeder ve kontrolü, zaman uyumsuz yöntemin arayanına döndürür .

Örneğin, eşzamansız yürütme, kullanıcı arayüzünü engellemeyecek ve Some TextBox.Textindirme bittikten sonra güncellenecektir

private async void OnButtonClick()
{
   SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}

Çok güzel dedi!
Şef,

Daha ayrıntılı olarak açıklayabilir misiniz? Diyorsun ki ... bu olmazsa ... ana konudaki gibi UI ile etkileşime giremezsin. Bu, bunun yalnızca etkileşimin web sunucusu iş parçacığından ayrı olduğu web'e uygulanan bir uygulama türü programında uygulanabilir olacağı anlamına mı geliyor? Bu yüzden bir somun kabuğundaki bu yalnızca önemli hale gelir, yani ana ipliğiniz akan diş ise, senkronize edilmez *. Bu, beklenmedik bir davranış oluşturmaz mı, yani bir Uygulamada (1 ana iş parçacığında) iki düğme tıklatıldı .. ama ilkini tamamlamadan 1'i tıklayabiliyor musunuz?
Seabizkit

Ne hakkında Console.WriteLine(await GetStringOverNetwork());? Asenkron çağrıların çıktısına ihtiyacınız varsa? İplik çalışmaya devam edebilecek olsa bile program ilk erişimde engeller mi?
Andrew

6

Hayır aynı değil.

Kişisel asynckod bloğu bekliyor await, ancak uygulamanın kalanı beklemiyor devam etmek dönüş çağrısının ve normal gibi hala devam edebilir.

Buna karşılık, senkronize bir çağrı tüm uygulamanızın ya da iş parçanızın, kodun başka bir şeyle devam etmesi için yürütmeyi tamamlayana kadar beklemesini sağlar.


senkronizasyon çağrısı async + await olarak uygulanamadı mı?
cırcır ucube

@ratchetfreak Bekleme / async ayarlaması için ek yükler olduğunu düşünüyorum, bu nedenle tüm başvurunuzu bununla kodlamak isteyeceğinizi sanmıyorum. Yalnızca uzun süre çalışan kod bloklarını çalıştırmak için kullanırım, böylece uygulamalarımı kilitlemez. :)
Rachel

5

Lütfen zaman uyumsuzluk / beklemeyle ilgili konuları açıklamama izin ver.

Beklendiğinde, temel durum makinesi kontrolün derhal iade edilmesini sağlar. Ardından, beklenen çağrı tamamlandığında, temel durum makinesi, beklenen çağrıdan sonra hatta çalışmaya devam etmesine izin verir.

Bu nedenle, eşzamansız blok engellenmiyor ne de beklenen çağrının bitmesini bekliyor; Await komutu ile karşılaşıldığında kontrol hemen geri döner.

Altta yatan devlet makinesi, kullanılmayan ve kaçırılmayan zaman uyumsuz / beklemenin kullanımının arkasındaki "sihir" in bir parçasıdır.


2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.