25

await httpClient.SendAsync(httpContent)コード/URLにエラーは見つかりませんでしたが、まだハングしています。提案/助けてください。

次のように私のコード:

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;
}

次のように別のクラスで呼び出します。

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

5 に答える 5

46

コールスタックのさらに上で、呼び出しているWaitResult、返されたTask. これによりデッドロックが発生します。これについては、ブログで詳しく説明しています。

要約awaitすると、コンテキストをキャプチャし、それを使用してasyncメソッドを再開します。UI アプリケーションでは、これは UI スレッドです。ただし、UI スレッドが (Waitまたはの呼び出しでResult) ブロックされている場合、そのスレッドを使用してメソッドを再開することはできませんasync

于 2013-10-31T10:51:37.527 に答える
13

これは私のために働いた:

httpClient.SendAsync(httpContent).ConfigureAwait(false);
于 2014-09-04T20:35:55.417 に答える
1

これは私の場合は問題ありません

  var response = httpClient.SendAsync(request);
  var responseResult = response.Result;

  if (responseResult.IsSuccessStatusCode)
  {
         var result = responseResult.Content.ReadAsStringAsync().Result;
         return result;
  }
于 2020-01-30T09:13:04.370 に答える