2014-09-08 47 views
11

Web hizmeti isteği asenkronize etmek istiyorum. Burada diyoruz: Burada Async/await yönteminden dönüş listesi

List<Item> list = GetListAsync(); 

bir liste dönmelidir benim işlevinin bildirimi,: Ben aşağıdaki hatayı alıyorum derlemek istiyorsanız

private async Task<List<Item>> GetListAsync(){ 
    List<Item> list = await Task.Run(() => manager.GetList()); 
    return list; 
} 

Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List<Item>> to System.Collections.Generic.List<Item> 

Bildiğim kadarıyla async değiştiriciyi kullanırsam, sonuç otomatik olarak Görev ile sarılır. Bence bu olmadı çünkü Task.Run kullanıyorum. Ben Task.Run(() => bölümünü kaldırırsanız ben

Ben yöntemleri bekliyor/Tam asenk anlaşılamamıştır düşünüyorum System.Collections.Generic.List ifadeyi

bekliyor Can not olsun. Ne yapıyorum yanlış? Listede beklemek için kodunuzu düzeltmek gerekir

+0

olası yinelenen [örtülü Görev dan türünü dönüştürülemez <>] (http: // stackoverflow. com/questions/12886559/ed-implicitly-convert-type-from-task) – i3arnon

cevap

27

indirilecek:

List<Item> list = await GetListAsync(); 

Ayrıca, bu kod bulunduğu yöntem, async değiştirici olduğundan emin olun.

Bu hatayı almanızın nedeni, GetListAsync yönteminin Task<T> değerini döndürmesidir; bu tamamlanmış bir sonuç değildir. Listeniz eşzamansız olarak indirildiğinden (Task.Run() yüzünden) await anahtar sözcüğünü kullanarak görevin değerini ayıklamanız gerekir.

Eğer Task.Run() kaldırırsanız, eşzamanlı olarak indirilecek listelemeye ve Task, async veya await kullanmaya gerek yoktur.

Bir daha öneri: Eğer tek şey sadece farklı konuya operasyonu devrederek ise GetListAsync yöntemde beklemek gerekmez, bu nedenle aşağıdaki kodunuzu kısaltabilirsiniz:

private Task<List<Item>> GetListAsync(){ 
    return Task.Run(() => manager.GetList()); 
} 
+0

Ayrıca, bu kodu çağıran yöntemin bir "async" yöntemi (henüz yapmadıysa) yapıldığından emin olmaları gerekir. –

+0

Neyi anlamıyorum, neden iki kez beklemem gerekiyor? – testing

+0

@Testing, iki kez beklemeniz gerektiğinden iki kez beklemeniz gerekiyor –

7

@ takemyoxygen'ın cevabına ek olarak, Async ile biten bir işlev adının olması sözleşmesi, bu işlevin gerçekten eşzamansız olmasıdır. Yani Yeni bir iş parçacığı başlatmaz ve yalnızca Task.Run'u çağırmaz. bu senin işlevinde olan tüm kodu ise, tamamen kaldırmak için daha iyi ve basit olacak: içinde

List<Item> list = await Task.Run(() => manager.GetList()); 
+0

yönteminin kendisini bekliyorsunuz Ayrıca istisnaları yakalamak için bir try/catch bloğum var ve bir spinner gösteriyorum . Yani yöntem adımı doğru mu? – testing

+0

evet iyi olmalı diye düşünüyorum, yeni bir iş parçacığı başlatmak ideal değil ama kılavuzun işlevinin "Task.Run" içindeki işlevinin eşzamanlı bir versiyonunu çağırmak olduğunu düşünüyorum. –

İlgili konular