J'ai réussi à extraire les données json dans une chaîne à l'aide d'une application console dans Visual Studio 2015. Maintenant, j'ai essayé de répliquer cela pour wpf, mais j'ai trouvé que je ne peux pas utiliser .GetResponse () et je dois utiliser GetResponseAsync () au lieu. Après avoir cherché sur Google pendant un certain temps, je pense que je comprends le point de async / await mais je semble être coincé dans une impasse. Voici donc mon code actuel:

Il s'agit de la méthode async qui extrait les données de retour d'une API Web et renvoie une chaîne JSON. Ou dans ce cas un Task<String>.

public async static Task<String> GetTrola(string station)
        {
            var url = "http://www.trola.si/" + station;

            string text;

            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Accept = "application/json";

            var answer = (HttpWebResponse)(await request.GetResponseAsync());

            using (var sr = new StreamReader(answer.GetResponseStream()))
            {
                text = sr.ReadToEnd();
            }
            return text;
        }

J'appelle ensuite la fonction dans un événement de clic de bouton, comme ceci:

string station = textBox.Text.ToString();
string output = GetJson.Trola.GetTrola(station).Result;
var myObject = JsonConvert.DeserializeObject<Result>(output);

Mais je pense que le problème est dans la fonction GetData en particulier cette ligne:

var answer = (HttpWebResponse)(await request.GetResponseAsync());

Je ne sais pas pourquoi cela se produit, car j'ai attendu la demande avec le mot clé await? Quelque chose d'autre me manque?

1
mythic 25 déc. 2015 à 23:45

2 réponses

Meilleure réponse

Dans cette ligne

string output = GetJson.Trola.GetTrola(station).Result;

Vous bloquez le thread de l'interface utilisateur. Le même thread sur lequel la partie de GetData après await doit s'exécuter. Impasse.

Vous devez utiliser await pour obtenir le résultat

string output = await GetJson.Trola.GetTrola(station);

Vous pouvez trouver une explication très détaillée sur blog de Stephen Cleary.

4
Jakub Lortz 25 déc. 2015 à 20:49

Je peux me référer ce code et référentiel par exemple, c'est exactement ce que vous voulez.

public async Task<TranslateResult> Find(TranslateRequest translateRequest)
{
    if (!configuration.IsAppropriateForTranslation(TranslatorType))
        return new TranslateResult(false, new Maybe<string>());

    var address = configuration.TurengUrl;
    var uri = new Uri(address + translateRequest.CurrentText);

    var turenClient = new WebClient();
    turenClient.Encoding = Encoding.UTF8;
    turenClient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36");
    turenClient.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8,tr;q=0.6");
    turenClient.CachePolicy = new HttpRequestCachePolicy(HttpCacheAgeControl.MaxAge, TimeSpan.FromHours(1));

    var compositeMean = await turenClient.DownloadStringTaskAsync(uri);
    var organizer = meanOrganizerFactory.GetMeanOrganizers().First(x => x.TranslatorType == TranslatorType.TURENG);
    var mean = await organizer.OrganizeMean(compositeMean);

    return new TranslateResult(true, mean);
}
0
Oğuzhan Soykan 25 déc. 2015 à 21:11