2015-07-23 14 views
7

Ben aşağıdaki kod biraz var -Task.WhenAll (...) .ContinueWith (AnotherAwaitable) ile nasıl bekleyebilirim?

await Task.WhenAll(TaskList /*List of Task objects*/); 
await AnotherAwaitableMethod(); 

Bu iyi çalışır ve AnotherAwaitableMethodTaskList içinde bir görev çalıştırmadan önce tam olduğunu belli yapmaya dayanır olarak gereklidir.

Ancak, ben

await Task.WhenAll(TaskList).ContinueWith(/*AnotherAwaitableMethod call?*/); 

gibi bir şey bu mümkün mü söylemek mümkün olmak istiyorum? Task.ContinueWith'un amacını yanlış anladım mı?

+1

kullanarak yapmak istediğinizde, aşağıdaki gibi bir şey yapabilirsiniz: Task.WhenAll (TaskList) .ContinueWith (_ => AnotherAwaitableMethod()) Unwrap(); '. Ama ilk kod zaten çalışıyorsa, neden buna ihtiyacınız var? – PetSerAl

+0

de, sorudaki operatif kelime, ihtiyaç duyulan, ama semantik değil - Kodlama tercihi; Aramanın tek bir satırda olmasını istiyorum. – Will

+0

@Will Bir başkaAwaitableMethod (Task.WhenAll (TaskList)) 'i bekleyerek, aynı satır üzerine koyabilirsiniz; –

cevap

12
await Task.WhenAll(TaskList /*List of Task objects*/); 
    await AnotherAwaitableMethod(); 

ve

await Task.WhenAll(TaskList /*List of Task objects*/).ContinueWith(_ => {AnotherAwaitableMethod();}).Unwrap(); 

hemen hemen aynı hareket edecektir. Bununla birlikte ContinueWith'i kullanmak, overloads'u kullanırsanız çok fazla hareket gücü sağlayacaktır. ContinueWith işlevini kullanmanın başlıca nedenlerinden biri, Koşulları ilk görev (ler) in sonucuna bağlı olarak veya TaskContinuationOptions

+0

Bunu bilmek istediğim şey; Teşekkür ederim. – Will

+2

İkinci görevi "şartlı olarak ilk" sonucunu beklemeksizin beklemekle bekleyebilirsin ve aslında "ContinueWith" ile daha da zorlaşırsın. Dahası, geri aramaları geri almak bir istisna olması ve hata ayıklama işlemini daha zor hale getirmesi durumunda sadece çağrılarınızı bozar. Bu tür geri çağırmaların kullanılması, ilk sırada async/bekletme noktasına sahip olma noktasını ortadan kaldırır. –

+1

Bu, "AnotherAwaitableMethod" işlevi bir "Görev" döndürdüğü için Görev 'döndürecektir. Unwrap() 'i kullanmanız gerekir. Ayrıca TaskFactory.ContinueWhenAll' vardır. Ama Asad haklı, 'Bekle', @Will üzerinde herhangi bir form 'ContinueWith' lehine olmamalıdır. – Noseratio

İlgili konular