2016-11-30 6 views
1

私のUIをフリーズせずに返信するのに数秒かかるHTTPポストを送りたいのですが、現在、このコードはメソッドが呼び出されたときにアプリケーションをハングアップさせます。C#HttpClient POST非同期

私は間違っていると私は私の目標をどのように達成するのですか?

private async Task<string> DoHttpClientPost(string method, IDictionary<string, object> args = null) 
    { 
     { 
      HttpClientHandler handler = new HttpClientHandler() 
      { 
       AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
      }; 
      handler.Proxy = null; 
      HttpResponseMessage response; 
      using (var myHttpClient = new HttpClient(handler)) 
      { 
       myHttpClient.DefaultRequestHeaders.ExpectContinue = false; 
       myHttpClient.DefaultRequestHeaders.Add("Accept-Charset", "ISO-8859-1,utf-8"); 
       myHttpClient.DefaultRequestHeaders.Add(APPKEY_HEADER, CustomHeaders.GetValues(APPKEY_HEADER)); 
       myHttpClient.DefaultRequestHeaders.Add(SESSION_TOKEN_HEADER, CustomHeaders.GetValues(SESSION_TOKEN_HEADER)); 
       myHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json-rpc")); 
       var call = new JsonRequest { Method = method, Id = 1, Params = args }; 
       var jsonObject = JsonConvert.Serialize<JsonRequest>(call); 
       var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json-rpc"); 
       response = await myHttpClient.PostAsync(new Uri(EndPoint), content); 
      } 
      Console.WriteLine("\nCalling: " + method + " With args: " + JsonConvert.Serialize<IDictionary<string, object>>(args)); 
      string jsonResponse = await response.Content.ReadAsStringAsync(); 

      return jsonResponse; 
     } 
    } 


    public T Invoke<T>(string method, IDictionary<string, object> args = null) 
    { 
     if (method == null) 
      throw new ArgumentNullException("method"); 
     if (method.Length == 0) 
      throw new ArgumentException(null, "method"); 
     var jsonString = DoHttpClientPost(method, args).Result; 
     var jsonResult = JsonConvert.Deserialize<JsonResponse<T>>(jsonString); 

     return jsonResult.Result; 
    } 

答えて

3
var jsonString = DoHttpClientPost(method, args).Result; 

これはあなたの犯人です。 UIスレッドからタスクに.Resultを呼び出すと、ハングします。

あなたは最高のすべての方法を非同期する必要があります - のでInvokeは非同期なるとTask<T>を返すとDoHttpClientPostコールを待つ必要があり、呼び出し側は、次の2つを行う必要があり

+0

var jsonString = DoHttpClientPost(method, args).Result; 

からこの行を変更することがあるように見えますが、あなたの助けをいただき、ありがとうございます。 – itsdrea

0

非同期などなどなどする必要があります

response = await myHttpClient.PostAsync(new Uri(EndPoint), content).ConfigureAwait(false); 
01に

response = await myHttpClient.PostAsync(new Uri(EndPoint), content); 

からこの行を変更変更

そして、あなたの意図が結果を完了して返すためにポストコールを待ち、そう

var jsonStringTask = DoHttpClientPost(method, args); 
jsonStringTask.Wait(); //wait for http post call to complete. 

var jsonString = jsonStringTask.Result;