2
votes

Pourquoi mon débogueur semble-t-il bloqué sur une instruction d'attente?

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 :

 entrez la description de l'image ici


2 commentaires

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.


3 Réponses :


0
votes

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.


0 commentaires

-1
votes

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.


0 commentaires

7
votes

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 .