2012-03-03 10 views
5

Web hizmetine eşzamansız çağrı yapan bir yöntem kullanıyorum. Ben senkron bir alternatif sunmak istiyoruzAsync yönteminin sonucu

public static async Task<ReturnResultClass> GetBasicResponseAsync() 
{ 
    var r = await SomeClass.StartAsyncOp(); 
    return await OtherClass.ProcessAsync(r); 
} 

Ve: Bunun gibi bir şey Result çağrı

public static ReturnResultClass GetBasicResponse() 
{ 
    return GetBasicResponseAsync().Result; 
} 

Ama blokları. Çünkü async işlemleri ile aynı iş parçacığı üzerinde çağrılır. Sonuçları eşzamanlı olarak nasıl alabilirim?

Teşekkürler! Eğer bir GUI uygulamasında, bir async yöntemin devamı parçası (ler) varsayılan olarak UI iş parçacığı üzerinde çalıştırır eğer

cevap

8

Haklısın. Aynı anda UI iş parçacığı üzerinde aynı Görev için senkronize beklerseniz, bir kilitlenme alırsınız. sizin bir uygulama söz konusuysa

, sadece eşzamanlı görev için bekleyen vermeyerek bunu çözebiliriz. Eğer sadece bir kütüphane yazıyorsanız

, sen ConfigureAwait(false) kullanarak bu sorunu giderebilirsiniz. Bu şekilde, yöntemin devamı kısmı yakalanan bağlamda (GUI uygulamalarındaki UI iş parçacığı) değil, bir ThreadPool iş parçacığı üzerinde yürütülür. Tabii

public static async Task<ReturnResultClass> GetBasicResponseAsync() 
{ 
    var r = await SomeClass.StartAsyncOp().ConfigureAwait(false); 
    return await OtherClass.ProcessAsync(r).ConfigureAwait(false); 
} 

, ideal çözüm isterlerse diğerleri yöntemlerden eşzamanlı sürümlerini kullanabilmek için GUI'nizin uygulamalar kitaplığınızda ve kullanımı ConfigureAwait() yılında senkronize işlemleri kullanmak getirmemektir.

+0

Teşekkürler! 'ConfigureAwait' lib'imin async istemcilerini etkiler mi? Async operasyonları uyumsuz kalır mı, yoksa tüm müşteriler için diğer iş parçacığı üzerinde çalıştırılacak mı? – gor

+0

Evet, aynı zamanda istemcileri de etkileyecek, ancak bir şekilde tamamlanmalı. Async işlemleri uyumsuz kalır, sadece 'ConfigureAwait()' işlevini kullanan kodun devam eden kısmı, UI iş parçacığı üzerinde yürütülmez. Ancak, UI iş parçacığı üzerinde başlayan yöntemlerde herhangi bir uyumsuz kodu orada kalır ('ConfigureAwait()' işlevini burada kullanmazsanız). – svick