webentwicklung-frage-antwort-db.com.de

waitit httpClient.SendAsync (httpContent) reagiert nicht

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;
20
Priti

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.

28
Stephen Cleary

das hat für mich funktioniert: 

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

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.

0
Sanjay Tank