2015-09-09 24 views
20

senaryodur:Bir "async" yöntemini "beklediğimde", zaman uyumlu hale geldi mi? Yani burada

static async void Main(string[] args) 
{ 
    await AnAsyncMethod(); 
} 

private static async task<bool> AnAsyncMethod() 
{ 
    var x = await someAsyncMethod(); 
    var y = await someOtherAsyncMethod(); 

    return x == y; 
} 

mi "someAsyncMethod" ve beklenmelidir kullandığınız ya onlar yürütülmektedir sırayla uyumsuz çalışan hem çünkü eşzamanlı çalışan "someOtherAsyncMethod"?

GÜNCELLEME biz sadece yürütme durdurmak için gidiyoruz eğer bu yöntem yapma amacı ne olacağını bekliyordu zaman uyumsuz yöntemleri sırayla çalışacaktır belirten altında cevap, ilk etapta asenkron çağırır Verilen

ve bu yöntemin dönüş değerlerini bekle? Geçmiş kullanımda yerel uygulamaların UI iş parçacığını boşaltmanın bir yolu olarak beklediğini/beklemediğini gördüm, ancak bu tasarımın neden istenebileceğine dair başka nedenler var mı?

+5

küçük sidenote 'Main' onun kendisi' – Jamiec

+0

async' orada o zaman uyumsuz yöntemini başka başka sınıf oluşturmak ve koyarsanız, @Jamiec yorumun üstünde olarak işaretlenmemiş olarak await', daha sonra arayabilir 'kullanamazsınız Ana metodunuzda, 'new SomeClass(). AnAsyncMethod.Wait();' ve eşzamansız olarak gerçekleşecektir –

+1

Anlayışım, SomeAsyncMethod'un bazıOtherAsyncMethod'un başlayabilmesi için tamamıyla tamamlanacağıdır. – Biscuits

cevap

27

Eşzamansız olarak çalışıyorlar, ancak sırayla. someAsyncMethod bitirene kadar çağrılmaz. Geçtiğimiz kullanımda yerel uygulamalarını gördük

bekliyor: Eğer paralel onlara çalıştırmak istiyorsanız

, sen Takip eden soru

var taskA = MethodA(); 
var taskB = MethodB(); 

var a = await taskA; 
var b = await taskB; 

// or 

var results = await Task.WhenAll(MethodA(), MethodB()); 

çeşitli seçenekler

var/UI dizisini serbest bırakmak için bir araç olarak async, ancak bu tasarımın istenilmesinin başka nedenleri var mı? MethodA/MethodB çalışırken bir ASP.NET uygulamasında

, geçerli iş parçacığı threadpool geri dönmek ve diğer gelen isteklere hizmet sağlamak için bu kullanmak isteyeceksiniz - bu yöntemler gerçek yapıyoruz EĞER async I/O. Temel olarak, bir ASP.NET uygulamasında bunu yapmanın tek nedeni budur.

Ayrıca Stephen Cleary adlı okumak isteyebilirsiniz:

+2

Not: Aynı bağlamda, iki taraflı EF çağrıları ile Task.WhenAll kullanamazsınız. Bu beni daha önce ısırdı. –

+4

Sadece ASP.NET'te değil - herhangi bir çok kullanıcılı sunucu uygulamasında, iş parçacığı sayınızı düşük tutmanızdan yararlanırsınız. Her iş parçacığı göz ardı edilemez bellek ve CPU kullanımı anlamına gelir - 4000 iş parçacığınız varsa, varsayılan iş parçacığı yığınlarında yalnızca 4 GiB bellek kaybettiniz (en azından beklenmedik şekilde). Ve sadece CPU çekirdeğiniz, verdiğiniz veya aldığınız kadar çok iş parçacığından beri, bu tamamen gereksiz bir israftır. Bu özellikle, 32 bitlik bir uygulamada geçerlidir; * sanal * bellek miktarı bile sınırlıdır. – Luaan

+0

@Luaan Ek için teşekkürler, çok yararlı! – dcastro