Soru C # Async - Nasıl çalışır?


Microsoft duyurdu Visual Studio Async CTP bugün (28 Ekim 2010) async ve await Eşzamansız yöntem yürütme için C # / VB içine anahtar kelimeler.

İlk önce derleyicinin, anahtar kelimeleri bir iş parçacığı oluşturmasına dönüştürdüğünü düşündüm. Beyaz kağıt ve Anders Hejlsberg'in PDC tanıtımı (saat 31: 00'de) asenkron çalışma ana iş parçasında tamamen gerçekleşir.

Aynı iş parçacığına paralel olarak nasıl bir işlem gerçekleştirebilirim? Teknik olarak nasıl mümkün ve IL'da gerçekte ne tür bir çeviri yapılmakta?


44
2017-10-28 21:47


Menşei




Cevaplar:


Benzer şekilde çalışır yield return C # 2.0 anahtar kelimesi.

Eşzamansız bir yöntem aslında sıradan bir sıralı yöntem değildir. Bazı durumlarla (yerel değişkenler nesnenin alanlarına dönüştürülür) bir durum makinesine (nesne) derlenir. İki kullanım arasında her kod bloğu await durum makinesinin bir "adımıdır".

Bu, yöntem başladığında, ilk adımı çalıştırır ve daha sonra durum makinesinin, yapılması gereken bazı işleri geri döndürdüğü ve planladığı anlamına gelir - iş bittiğinde, durum makinesinin bir sonraki adımını çalıştırır. Örneğin bu kod:

async Task Demo() { 
  var v1 = foo();
  var v2 = await bar();
  more(v1, v2);
}

Şunun gibi bir şeye tercüme edilir:

class _Demo {
  int _v1, _v2;
  int _state = 0; 
  Task<int> _await1;
  public void Step() {
    switch(this._state) {
    case 0: 
      this._v1 = foo();
      this._await1 = bar();
      // When the async operation completes, it will call this method
      this._state = 1;
      op.SetContinuation(Step);
    case 1:
      this._v2 = this._await1.Result; // Get the result of the operation
      more(this._v1, this._v2);
  }
}

Önemli olan, sadece SetContinuation işlem tamamlandığında, bunu çağırmak için yöntem Step yöntemini tekrar (ve yöntem kullanarak orijinal kodun ikinci bitini çalıştırması gerektiğini bilir _state alan). Bunu kolayca hayal edebilirsin. SetContinuation gibi bir şey olurdu btn.Click += Step, tamamen tek bir iş parçacığı üzerinde çalışırdı.

C # 'daki eşzamansız programlama modeli, F # zaman uyumsuz iş akışlarına çok yakındır (aslında, bazı teknik detayların yanı sıra, aynı şeydir) ve reaktif tek iş parçacıklı GUI uygulamalarını kullanarak async oldukça ilginç bir alan - en azından öyle düşünüyorum - örneğin bkz. Bu makale (belki şimdi bir C # sürümü yazmalıyım :-)).

Çeviri yineleyicilere benzer (ve yield return) ve aslında, daha önce C # 'de eşzamansız programlama uygulamak için yineleyiciler kullanmak mümkün oldu. yazdım bununla ilgili bir makale bir süre önce - ve çevirinin nasıl çalıştığına dair size biraz bilgi verebileceğini düşünüyorum.


75
2017-10-28 22:19





Aynı iş parçacığına paralel olarak nasıl bir işlem gerçekleştirebilirim?

Yapamazsın. Eşzamanlılık "paralellik" veya "eşzamanlılık" değildir. Asenkronizasyon paralellik ile uygulanabilir veya olmayabilir. Çalışmayı küçük parçalara ayırmak, her bir işi bir kuyruğa koymak ve daha sonra iş parçacığının herhangi bir şey yapmadığı her iş parçasını yürütmek suretiyle gerçekleştirilebilir.

Bütün bu şeylerin nasıl çalıştığına dair blogumda bir dizi makale var; Bu soruya doğrudan almanca, muhtemelen önümüzdeki hafta Perşembe günü başlayacak. İzlemek

http://blogs.msdn.com/b/ericlippert/archive/tags/async/

detaylar için.


44
2017-10-29 23:49





Anladığım kadarıyla async ve await anahtar kelimeler yapmak her zaman bir async yöntem kullanır await anahtar sözcüğü, derleyici, yöntemin geri kalanını, zaman uyumsuz işlemi tamamlandığında zamanlanan bir devamlılığa döndürecektir. Bu izin verir async arayan kişiye geri dönmek ve async bölümü tamamlandığında çalışmaya devam etmek için yöntemler.

Mevcut makalelere göre, bununla ilgili çok fazla ayrıntı var, fakat yanılmadıkça, bunun özü bu.

Gördüğüm gibi, async yöntemlerinin amacı paralel olarak çok fazla kod çalıştırmak değil, async yöntemlerini bir dizi küçük parçaya ayırmak, gerektiğinde çağrılabilir. Önemli nokta, derleyicinin, görevler / süreklilikleri kullanarak geri aramaların tüm karmaşık kablolarını ele alacağıdır. Bu sadece karmaşıklığı azaltmakla kalmaz, aynı zamanda async yönteminin geleneksel eşzamanlı kod gibi az ya da çok yazılmasına olanak tanır.


7
2017-10-28 21:53



Ayrı bir iş parçacığı olmadan nasıl planlanır? Sürdürülebilirlik, CLR'de hafif bir programlamaya izin veren belirli bir kavram mıdır? - Dirk Vollmar
@ 0xA3: Yazının async yönteminin kendi iş parçacığı üzerinde çalışmadığını söylediğine inanıyorum. Yani Tıpkı TPL gibi, duruma bağlı olarak mevcut iplik ve iplik havuzu ipliklerinin bir karışımı olacaktır. - Brian Rasmussen