2011-11-11 8 views
0

Je suis coincé sur quelque chose qui semble simple mais je ne peux pas voir ce que je fais mal. J'ai une structure de classe simple 'StaticQuote' qui décrit les valeurs renvoyées à partir d'un calcul complexe pour lequel j'essaie de trouver la valeur la plus faible. Parce que l'appel Calculate est cher, je crée un tableau de tâches afin que les calculs s'exécutent en parallèle, et ensuite j'utilise une Task.WhenAll pour attendre qu'ils aient tous fini avant de comparer les résultats (qui sont stockés dans les objets StaticQuote). Le problème est que lorsque vous essayez de retourner le tableau de StaticQuotes Je reçois l'erreur suivante:Async CTP Task.WhenAll numéro

Cannot implicitly convert type 'System.Threading.Tasks.Task<Services.QuoteGeneratorAsync.StaticQuote[]>' to 'Services.QuoteGeneratorAsync.StaticQuote[]'

J'ai vu des exemples similaires avec des chaînes etc où cette affectation fonctionne parfaitement ne peut donc pas comprendre que le côté droit ne revient pas un tableau de résultats StaticQuote? Je suis nouveau au code multi-thread et le CTP Async. Quelqu'un peut-il fournir la réponse? Merci beaucoup.

exemple problème:

List<Task<StaticQuote>> Calculations = new List<Task<StaticQuote>>(); 
foreach() 
{ 
Calculations.Add(TaskEx.RunEx(() => Calculate(...my params....)));            
} 
StaticQuote[] Quotes=TaskEx.WhenAll<StaticQuote>(Calculations); --//this line won't compile 

Répondre

1

TaskEx.WhenAll retourne un Task<T[]> qui indique que toutes les autres tâches ont terminé. Donc, vous voulez:

StaticQuote[] quotes = await TaskEx.WhenAll(Calculations); 

L'expression await "déballe" un Task<T> à un T. Donc ailleurs si vous avez:

Task<string> downloadTask = webClient.DownloadStringTaskAsync(url); 
string result = await downloadTask; 

c'est exactement la même chose - il est juste que la version WhenAll est un peu plus compliquée, car il a une collection des entrées de tâches et de sorties, au lieu d'un seul.

De toute évidence, pour utiliser await, vous devez commencer par une méthode async.

Si tout cela prête encore à confusion, vous voudrez peut-être lire mes blog posts about async, ainsi que those of Eric Lippert. (Il y en a beaucoup d'autres disponibles aussi, bien sûr.)

+0

Merci beaucoup Jon - n'attendra pas parce que le fil de continuer? J'ai un niveau supérieur pour la boucle qui appelle à nouveau le tout alors essayait de conroler le nombre de threads sur le coup à la fois. J'ai vu cet exemple http://stackoverflow.com/questions/4174806/what-is-taskex-whenall-in-the-async-ctp pourquoi la mission qu'il fait ici ne marche pas pour moi? Comment va Tony the Pony? :) – dustybin

+0

@dustybin: 'await' provoquera le retour de la méthode à l'appelant, mais il reviendra dans cette méthode quand toutes les tâches auront été complétées. L'affectation à l'intérieur de la question liée * fait * utiliser 'await', donc je ne suis pas sûr de ce que vous voulez dire ... –

+0

Oui, l'exemple utilise wait mais j'étais inquiet que si le thread continue, il va générer le prochain lot de calculer discussions de ma boucle externe. Cela ne devrait pas poser de problème, j'essayais juste de voir si je pouvais contrôler le nombre de threads car Calculer() prend 3-5 secondes pour revenir. Je ne voulais pas que beaucoup d'entre eux courent à la fois. J'étais à votre présentation de DDD Modern .Net sur Async l'année dernière (génial) mais c'est la première fois que j'ai dû l'utiliser. Aussi tout juste réalisé WhenAll a une propriété ".Result" - doh. va lire les blogs ... acclamations. – dustybin

Questions connexes