SORU
29 EKİM 2010, Cuma


Nasıl C# 5.0'In uyumsuz-bekliyor özellik VUK farkı nedir?

C arasındaki farklı görmüyorum#'nin (ve VB.) yeni zaman uyumsuz özellikleri ve .NET 4.0 Task Parallel Library. Al, örneğin, Eric Lippert kodu from here:

async void ArchiveDocuments(List<Url> urls) {
    Task archive = null;
    for(int i = 0; i < urls.Count;   i) {
        var document = await FetchAsync(urls[i]);
        if (archive != null)
            await archive;
        archive = ArchiveAsync(document);
    }
}

await anahtar sözcük iki farklı amaçlara hizmet ediyor gibi görünüyor. İlk geliş (FetchAsync) demek gibi görünüyor"Eğer bu değer kullanılırdaha sonra yöntemive onun görevi bitti, devam etmeden önce bitene kadar bekleyin değildir."İkinci örnek (archive) demek gibi görünüyor"Eğer bu görevi henüz bitmiş değil, bekleşu andatamamlanıncaya kadar."Eğer yanılıyorsam lütfen beni düzeltin.

Çok kolay böyle yazılmış olamaz mı?

void ArchiveDocuments(List<Url> urls) {
    for(int i = 0; i < urls.Count;   i) {
        var document = FetchAsync(urls[i]);       // removed await
        if (archive != null)
            archive.Wait();                       // changed to .Wait()
        archive = ArchiveAsync(document.Result);  // added .Result
    }
}

Değeri aslında olması gereken Task.Result bir ve ikinci ile 8* *ilk değiştirdim beklemek gerçekten oluşup Task.Wait() ile await. İşlevselliği (1) zaten uygulanan ve aslında kodda neler olup bittiğini (2) anlamsal olarak çok daha yakın.

async bir yöntem devlet bir makine olarak kullanımına benzer yeniden olmadığının farkındayım, ama ben de getiriyor anlamadım. Herhangi bir kod gerektiren başka bir iş parçacığı için çalışır (gibi indirme) hala gerektiren başka bir iş parçacığı, ve herhangi bir kod yok (gibi bir dosyadan okuma) olabilir hala kullanmak VUK çalışmak için sadece tek bir iplik.

Belli ki büyük bir şey işte; kimse beni anlamak yardım bu biraz daha iyi olabilir? kaçırıyorum

CEVAP
29 EKİM 2010, Cuma


Yanlış anlama burada ortaya çıkıyor sanırım

Anahtar sözcük iki farklı amaçlara hizmet bekliyor gibi görünüyor. İlk geliş (FetchAsync) "bu değer daha sonra bu yöntem kullanılır ve görevi bitmiş Değilse, devam etmeden önce bitene kadar bekleyin." demek gibi İkinci örnek (arşiv), "Eğer bu görevi henüz bitmiş değil, tamamlanıncaya kadar şimdi bekle." demek oluyor Eğer yanılıyorsam lütfen beni düzeltin.

Bu aslında tamamen yanlıştır. Bunların her ikisi de aynı anlama gelir.

İlk durumda:

var document = await FetchAsync(urls[i]);

Çalışma zamanı "FetchAsync aramaya Başlayın, bu yöntemi çağıran iş parçacığı için geçerli yürütme noktasına dönün." diyor burada ne olur. ""- Bunun yerine, infazı eşitleme içeriğe döner ve bir şeyler dönüyor. devam et bekleme yok Bir noktada gelecekte, FetchAsync Görevi tamamlamak olacak, ve bu noktada, bu kodu özgeçmiş arama iş parçacığı eşitleme bağlam ve sonraki ifade (atama belgesi değişken) ortaya çıkar.

Yürütme sonra devam kadar ikinci çağrı bekliyor - zaman aynı şey olacak - Task<T> (arşiv) değil tamamlamak, infaz çıkacak için arama bağlam - aksi takdirde, arşiv olarak ayarlanır.

İkinci durumda, her şey çok farklı - burada, arama eşitleme bağlamında asla tüm yöntem tamamlanıncaya kadar herhangi bir kod çalıştırmak için bir şans anlamına gelir açıkça engelliyor. Kabul ediyorum, hala asynchrony var, ama asynchrony tamamen bu kod bloğu içinde yer alan bu yapıştırılan kod yok kodu dışında da tüm kodunuzu tamamlanıncaya kadar bu konu üzerinde olacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • Ricardo Cerqueira

    Ricardo Cerq

    28 Mayıs 2008