web-dev-qa-db-fra.com

wait httpClient.SendAsync (httpContent) est non réactif

await httpClient.SendAsync(httpContent) ne répond pas bien que je n'ai trouvé aucune erreur dans le code/url, il est toujours bloqué. S'il vous plaît suggérer/aide.

Mon code comme suit:

public async Task<string> Get_API_Result_String(string url, List<KeyValuePair<string, string>> parameters)
{
    string res = "";

    try
    {
        IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

        //Prepare url
        Uri mainurl = new Uri(settings[FSAPARAM.UserSettingsParam.SERVERNAME].ToString());
        Uri requesturl = new Uri(mainurl, url);

        var httpClient = new HttpClient();
        var httpContent = new HttpRequestMessage(HttpMethod.Post, requesturl);
        // httpContent.Headers.ExpectContinue = false;

        httpContent.Content = new FormUrlEncodedContent(parameters);

        HttpResponseMessage response = await httpClient.SendAsync(httpContent);

        var result = await response.Content.ReadAsStringAsync();
        res = result.ToString();

        response.Dispose();
        httpClient.Dispose();
        httpContent.Dispose();
    }
    catch (Exception ex)
    {
        Logger l = new Logger();
        l.LogInfo("Get_API_Result_String: "+ url + ex.Message.ToString());
        ex = null;
        l = null;
    }

    return res;
}

L'appeler dans une autre classe comme suit:

NetUtil u = new NetUtil();
string result = await u.Get_API_Result_String(Register_API, values);
u = null;
20
Priti

Je prédis que plus loin dans votre pile d'appels, vous appelez Wait ou Result sur un Task renvoyé. Cela provoquera une impasse que j'explique en détail sur mon blog.

Pour résumer, await capturera un contexte et l’utilisera pour reprendre la méthode async; sur une application d'interface utilisateur, il s'agit d'un fil d'interface utilisateur. Toutefois, si le thread d'interface utilisateur est bloqué (dans un appel à Wait ou Result), alors ce thread n'est pas disponible pour reprendre la méthode async.

28
Stephen Cleary

cela a fonctionné pour moi: 

httpClient.SendAsync(httpContent).ConfigureAwait(false);
8
Guillermo Varini

Je viens de supprimer await et juste utilisé comme ci-dessous et cela a fonctionné:

var result = httpClient.SendAsync(httpContent).Result;

Mais ce n’est pas une bonne pratique…. Comme Nikola mentionné, nous ne devrions pas mélanger les appels synchronisés et asynchrones.
J'ai changé la méthode d'appel en asynchrone et le problème a été résolu.

0
Sanjay Tank