2013-06-29 14 views
8

Yani this question yaklaşık async soruyordu, ben de buna sadece bir şeker sözdizimi olduğunu düşündüm:C# 5 şeker sözdizimi olarak mı (veya değil)?

Task<..>...ContinueWith...

Ve nihayet Result özelliği incelemek.

Hatta o here hakkında bir soru sordu ve ben söylendi:

enter image description here

enter image description here

But

Bugün I was corrected by Jon Skeet "O çok uzun bir yoldur".

Peki bu 2 yaklaşım arasındaki temel farklılıklar nelerdir?

+3

* Kavramsal * “beklemenin” kullanımı “ContinueWith” ile benzerdir, ancak “ContinueWith” ile kendinizin yapmak zorunda kalacağınız “beklemek” için çok az ayrıntı vardır. –

+0

Cevabı nasıl bu kadar zarif kestin? :) –

+0

@YairNevet hangisi? –

cevap

15

O olduğunu devamını ekleyerek - ama elle sürdürülmesinin inşa nedeniyle etrafında biz var olur ve hangi yerel devlet nerede hakkında tüm bilgileri taşımak için ihtiyaç, çok acı verici olabilir. Bir çok basit bir örnek olarak

, seni bu zaman uyumsuz yönteminin eşdeğer ile gelip tavsiye ederiz:

public static async Task<int> SumTwoOperationsAsync() 
{ 
    var firstTask = GetOperationOneAsync(); 
    var secondTask = GetOperationTwoAsync(); 
    return await firstTask + await secondTask; 
} 

// These are just examples - you don't need to translate them. 
private async Task<int> GetOperationOneAsync() 
{ 
    await Task.Delay(500); // Just to simulate an operation taking time 
    return 10; 
} 

private async Task<int> GetOperationTwoAsync() 
{ 
    await Task.Delay(100); // Just to simulate an operation taking time 
    return 5; 
} 

Gerçekten birinci yöntemin eşdeğer ile gelip deneyin. Aslında her seferinde uygun bir iş parçacığına geri dönmek istiyorsanız oldukça fazla kod almayı - özellikle bulursunuz. (Bu async yönteminde kodun örneğin bir WPF UI'yi de değiştirdiğini düşünün.) Oh, ve görevlerden herhangi biri başarısız olursa, iade edilen görevinizin de başarısız olmasına dikkat edin. (Async yöntemi, ilk görev başarısız olursa, ikinci görevin başarısızlığını "" özleyecektir, ancak bu, göreceli olarak küçük bir sorun IMO'dur.)

Ardından, kodunuzu nasıl değiştirmeniz gerekeceğini öğrenin. async yönteminde try/finally eşdeğeri gerekli. Yine, bu async olmayan yöntemi daha karmaşık hale getirecektir. Hepsi yapılabilir, ama boyunda bir acı var. Yani evet, sözdizimsel şeker olan "sadece". Yani foreach. Yani bir for döngü (veya başka bir döngü). async/await durumunda, sözdizimsel şeker, kodunuzu dönüştürmek için gerçekten çok şey yapabilir.

Orada sürü zaman uyumsuz etrafında videolar ve blog gönderilerinin, ve ben bekleyebileceğiniz sadece izliyor/birkaç tanesi okuma bu küçük çimdik uzak olduğunu takdir size yeterince fikir verecek: Bu radikalBüyük miktarda eşzamansız kodu doğru şekilde yazmanın ne kadar pratik olduğunu değiştirir.

Ayrıca, desen tabanlı varlık, zaman uyumsuz/sizi bekleyen değil sadece Task/Task<T> üzerinde eser. Beklenen kalıba yapışan her şeyi bekleyebilirsiniz.Uygulamada, çok az sayıda geliştiricinin kalıbı kendileri uygulamaya koyması gerekecek, ancak bir görev yerine bir YieldAwaitable döndüren Task.Yield gibi yöntemlere izin verilir.

+0

-Teşekkür ederim Jon. –

+0

Yani hayır, "sadece" sözdizimsel şeker değil! Yönetilen IL'ye bakınız. Görev arasındaki fark ile async/await kullanmadan ve kullanmadan çok şaşıracaksınız. – hVostt

+2

@hVostt: Çok fazla * async/await kodunu çözdüm. Artık farkı fark etmeyeceğim, ama hala "sadece" sözdizimsel şeker olduğunu düşünüyorum. Bu kitlesel olarak yararlı ve oldukça karmaşık sözdizimsel şekerdir ve bazen sonuçlar, tam olarak * C# 4 kullanan IL * ile temsil edilemeyen koddur, ancak temelde daha önce gerçekten yapamayacağınız bir şey yapmaz. Tip sistemindeki temel bir değişim olan jenerikler gibi değil. Bu sadece derleyicinin akıllı olması. Ne kadar yararlı olduğunu göstermeye çalışmıyorum - I * love * async. Ama yine de sözdizimsel şeker IMO'su. –

İlgili konular