2013-08-13 2 views
1

Est-ce que j'utilise incorrectement la classe HttpClient? J'essaie de tester le statut HTTP des images et il semble ne pas être en cours d'exécution. J'ai une liste d'un objet complexe, donc je veux courir test sur tous les urls d'image pour voir qui urls sont brisés en faisant ceci:HttpClient vérifie le fichier d'image valide async

var client = new HttpClient(); 
var tasks = ObjectViewModel.Select(a => a.UserUrl).Select(url => 
client.GetAsync(url).ContinueWith(t => 
{ 
    var response = t.Result; 
    if (!response.IsSuccessStatusCode) 
    url = "/Content/Images/MissingPic.png"; 
})); 

que je faisais à l'origine il cela dans une boucle foreach comme ceci:

qui fonctionne parfaitement bien, mais prend environ 5 à 7 secondes pour terminer tous les éléments car ils sont tous en cours d'exécution séparément, ce qui est très long pour une demande de réponse à l'interface utilisateur.

Répondre

0

Linq est (généralement) paresseux. Cela signifie que les instructions Linq ne représentent qu'une requête. Le travail se produit lorsque vous énumérez la requête (matérialiser).

Vous ne matérialiserez jamais votre requête tasks. Pour le faire exécuter le code dans votre instruction select, vous devez matérialiser la requête en l'amenant à être énumérée.

Un moyen serait d'appeler simplement tasks.ToList()

+0

Ok maintenant il semble que cela fonctionne réellement, mais les urls cassés ne sont pas remplacés – Jake

1

Pensez à utiliser AsParallel() tout en itérer sur votre énumération, devrait l'accélérer considérablement.

var UrlToReponseMap = new Dictionary<string, bool>(); 
ObjectViewModel.AsParallel().ForAll(x => 
{ 
    UrlToReponseMap[x.UserUrl] = x.UserUrl.GetHttpRequest(); 
}); 
+0

est-ce pas ce que le GetAsync sur httpclient fait? En plaçant également AsParallel où? – Jake

+0

Je suis allé avec le Parallel.ForEach mais cela m'a définitivement mis dans la bonne direction – Jake

Questions connexes