await httpClient.SendAsync(httpContent)
reagiert nicht, obwohl ich keinen Fehler in Code/URL gefunden habe. Bitte vorschlagen/helfen.
Mein Code wie folgt:
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;
}
Aufruf in einer anderen Klasse wie folgt:
NetUtil u = new NetUtil();
string result = await u.Get_API_Result_String(Register_API, values);
u = null;
Ich sage voraus, dass Sie weiter oben in Ihrem Aufrufstack Wait
oder Result
für eine zurückgegebene Task
aufrufen. Dies wird zu einem Deadlock führen das erkläre ich in meinem Blog.
Zusammenfassend erfasst await
einen Kontext und verwendet diesen, um die async
-Methode fortzusetzen. In einer UI-Anwendung ist dies ein UI-Thread. Wenn der UI-Thread jedoch blockiert ist (in einem Aufruf von Wait
oder Result
), steht dieser Thread nicht zur Verfügung, um die async
-Methode fortzusetzen.
das hat für mich funktioniert:
httpClient.SendAsync(httpContent).ConfigureAwait(false);
Ich habe gerade await
entfernt und einfach als unten verwendet und es hat funktioniert:
var result = httpClient.SendAsync(httpContent).Result;
Aber das ist keine gute Praxis. Wie Nikola sollten wir nicht Sync- und Async-Aufrufe mischen.
Ich änderte die aufrufende Methode in asynchron und das Problem wurde behoben.