locked
Task et await bloqué RRS feed

  • Question

  • Bonjour, 

    Je souhaites utiliser les Task pour faire une requête http j'utilise donc cette méthode pour récupérer le string de réponse de ma requête :

            private async Task<bool> CheckIfNewXmlExistAsync()
            {
                HttpClient client = new HttpClient();
    
                string checkValueNow = await client.GetStringAsync("http://.......");
    
    
                IsolatedStorageSettings storage = IsolatedStorageSettings.ApplicationSettings;
                String originalCheckValue = null ;
                originalCheckValue = (string)storage["key"];
    
                if (!originalCheckValue.Equals(checkValueNow)){
    
                    Debug.WriteLine("xml file expired");
                    return true;
                }
    
                return false;
            }

    Mais quand je l’exécute la méthode reste bloqué à ce niveau :

    string checkValueNow = await client.GetStringAsync("http://backoffice.optin-r.com/fr/flux/bn?id=6&title=1&day=15&key=1");

    Pouvez vous m'éclairer svp ? Merci

    jeudi 15 janvier 2015 09:05

Réponses

  • Ah d'accord.

    Normalement, comme votre méthode renvoie un Task, il suffit de faire :

    bool test = await CheckIfNewXmlExistAsync();
    Après, pour faire cela, la méthode à partir de laquelle vous appelez doit être aussi marquée "async". S'il s'agit d'un abonnement à un événement, cela ne devrait pas poser de problème normalement.


    Philippe

    jeudi 15 janvier 2015 10:31

Toutes les réponses

  • Bonjour,

    Quand vous dites "la méthode reste bloquée à ce niveau" : Est-ce que ça fige aussi l'IHM? Est-ce que lorsque vous attendez un peu plus longtemps ça ne finit pas par faire une erreur?

    D'autre part est-ce que son équivalent synchrone se comporte de la même manière?

    Edit : oups, je n'avais pas vu tout de suite, c'est du dév pour Windows Phone, donc ma dernière question ne tiens pas car il n'y a pas d'équivalent synchrone.

    Du coup, la question serait plutôt : arrivez-vous à y accéder avec un client lourd développé en C# ou même avec IE?


    Philippe


    • Modifié PhGr_ jeudi 15 janvier 2015 09:26
    jeudi 15 janvier 2015 09:24
  • Bonjour Philippe,

    Oui l'url est accessible à partir de mon navigateur IE, je n'arrive pas à voir d'où vient le probléme

    jeudi 15 janvier 2015 09:31
  • Bonjour,

    Comment appelez-vous la méthode CheckIfNewXmlExistAsync() ?

    Car await/async est contagieux donc il faut toujours utiliser ce pattern a partir du moment où on commence à s'en servir.

    Et il ne faut surtout pas mélanger les méthodes qui synchronisent les tâches de la TPL (Task.Wait(), Task.Result) avec await/async.

    Donc si vous faites :

    CheckIfNewXmlExistAsync().Wait();
    
    // ou
    
    var res = CheckIfNewXmlExistAsync().Result;
    

    Vous risquez fort de provoquer un interblocage (le Task.Result fait un Task.Wait() avant de renvoyer le résultat).

    Ce qui pourrait expliquer votre problème.

    Si vous suivez les bonnes pratiques alors là je ne sais pas trop d'où pourrait venir le problème.

    Vérifiez également que vous n'avez pas d'exception levée à moment donné (timeout par exemple).

    Cordialement,


    Yan Grenier

    jeudi 15 janvier 2015 10:17
  • En effet j’appelle la méthode de cette façon :

    bool test = CheckIfNewXmlExistAsync().Result;

    Comment dois-je faire pour obtenir le résultat ?

    Concrètement ce que j'aimerais faire c'est faire un appel http et obtenir le résultat tout cela dans une seule méthode pour de pas avoir la réponse dans une autre méthode.

    Je n'utilise donc peut-être pas ce qui est le plus adapté ?

    Merci

     
    jeudi 15 janvier 2015 10:25
  • Ah d'accord.

    Normalement, comme votre méthode renvoie un Task, il suffit de faire :

    bool test = await CheckIfNewXmlExistAsync();
    Après, pour faire cela, la méthode à partir de laquelle vous appelez doit être aussi marquée "async". S'il s'agit d'un abonnement à un événement, cela ne devrait pas poser de problème normalement.


    Philippe

    jeudi 15 janvier 2015 10:31
  • Ou alors en éliminant le pattern await/async et en n'utilisant que la TPL.

    Cordialement,


    Yan Grenier

    jeudi 15 janvier 2015 10:49
  • Est-ce qu'il y à possibilité d’appeler la méthode à partir du constructeur d'une classe qui lui n'est pas un Task ?

    Merci

     

    Florian R SAS

    lundi 19 janvier 2015 14:14
  • Est-ce qu'il y à possibilité d’appeler la méthode à partir du constructeur d'une classe qui lui n'est pas un Task ?

    Merci

     

    Florian R SAS

    Non, pas à partir d'un constructeur, en effet.

    Cela dit, il y a des contournements possibles :

    - s'il s'agit d'une classe d'un IHM, il y souvent un événement d'initialisation auquel vous pouvez vous abonner pour appeler votre méthode avec await.
    - s'il s'agit d'une classe que vous avez créée et qui n'a rien à voir avec l'IHM, vous pouvez toujours utiliser le pattern "Singleton" pour renvoyer un objet "Task<TaClasse>" sur laquelle vous pourrez appeler avec un await.

    Si tout cela ne répond pas à votre question, pouvez-vous alors nous fournir un exemple de l'appel de votre code?


    Philippe

    lundi 19 janvier 2015 14:22
  • En fait je pense m'y prendre mal, voici le post sur lequel je parle un peut plus de ce que je cherche à faire.

    Cordialement


    Florian R SAS


    lundi 19 janvier 2015 14:31