Je suis nouveau dans ce domaine, alors soyez indulgents avec moi. Je débogue et rencontre un problème avec la ligne:
public class App : Application // superclass new in 1.3 { public App () { MainPage = new PinPage { Title = "Pins", Icon = "marker.png" }; } } public class PinPage : ContentPage { private async Task FetchDataAsync() { HttpClient client = new HttpClient(); string resultUrl = "http://myuser.gtempurl.com/Service1.svc/GetLocations"; var uri = new Uri(string.Format(resultUrl, string.Empty)); var response = await client.GetAsync(uri); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); var obj = JsonConvert.DeserializeObject(content); } } public PinPage () { FetchDataAsync().GetAwaiter().GetResult(); } }
J'ai modifié la question afin qu'elle soit conforme à un exemple minimal, complet et vérifiable.
Je marche -sur le débogueur sur cette instruction afin de passer à l'instruction suivante mais pour une raison encore inconnue de moi, le débogueur semble perdu et ne récupère pas.
Chaque fois que j'appuie sur le wait code > appeler et passer au-dessus, cela arrive à chaque fois. Le point d'arrêt du débogueur disparaît simplement.
Voici tout le code:
var response = await client.GetAsync(uri);
Le service WCF n'est pas le problème. Il est publié sur un serveur public, il est donc toujours disponible. Je l'appelle depuis un navigateur et il renvoie la chaîne attendue.
J'utilise VS2017 et il débogue dans un émulateur Android.
Voici une capture d'écran de quand point d'arrêt atteint la déclaration :
3 Réponses :
L'opérateur Attendre fonctionne de cette façon, lorsque vous attendez une tâche, l'exécution du code sautera hors de la fonction courante et cédera le contrôle à son appelant. Ensuite, lorsque la tâche attendue se termine, elle reviendra pour exécuter le code après l'instruction await.
Dans votre cas: L'opérateur d'attente suspend l'exécution jusqu'à ce que le travail de la méthode "client.GetAsync (uri)" soit terminé. En attendant, le contrôle est retourné à l'appelant de FetchDataAsync. Lorsque l'exécution de la tâche est terminée, l'expression d'attente est évaluée comme une réponse.
Si vous passez après que l'attente a évalué la réponse, le débogueur passera à l'étape suivante. Si l'attente n'a pas renvoyé, la surbrillance du débogueur est perdue.
Utilisez Postman ( https://www.getpostman.com/ ) pour tester d'abord l'URL. Si le facteur peut obtenir des données, il y a un problème avec votre application cliente. Sinon, l'API Web ne fonctionne pas.
il ne passe pas à la ligne suivante. Aucune autre ligne de code n'est surlignée en jaune, aucun délai d'attente, rien.
Cela ressemble à une impasse. Puisqu'il s'agit d'une application d'interface utilisateur, vérifiez davantage votre pile d'appels pour tout appel bloquant comme Wait ()
, Result
ou GetAwaiter (). GetResult () < / code>. Ceux-ci peuvent interblocage s'ils sont appelés à partir du thread de l'interface utilisateur .
La bonne solution est de les changer en wait
; en d'autres termes, utilisez async
jusqu'au bout a >.
Merci. J'ai modifié la question pour inclure un exemple complet.
@fdkgfosfskjdlsjdlkfsf: Le problème est la ligne .GetAwaiter (). GetResult ()
.
Merci encore. Y a-t-il une solution simple à cela?
@fdkgfosfskjdlsjdlkfsf: Il semble que vous chargiez des données dans un ViewModel d'interface utilisateur, donc je recommanderais ce type de liaison de données asynchrone .
Ce serait génial si vous pouviez fournir un exemple reproductible minimal , y compris comment
FetchDataAsync
est appelé.Vous pouvez trouver stackoverflow.com/ questions / 39007006 /… d'intérêt.