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;
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
.
cela a fonctionné pour moi:
httpClient.SendAsync(httpContent).ConfigureAwait(false);
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.