簡體   English   中英

C#HttpClient POST'ing Async

[英]C# HttpClient POST'ing Async

我想發送一個可能需要幾秒鍾才能回復而不凍結我的UI的http帖子,目前這個代碼只是在調用方法時掛起我的應用程序。

我做錯了什么,我如何實現目標?

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;
    }
var jsonString = DoHttpClientPost(method, args).Result;

這是你的罪魁禍首。 如果從UI線程調用任務上的.Result ,它將掛起。

你需要一直異步 - 所以Invoke應該是異步並返回一個Task<T>並等待DoHttpClientPost調用,調用者應該是異步等等。等等。

你必須做兩個改變

修改此行

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

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

看起來你的意圖是等待post調用完成並返回結果,所以修改這一行

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

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

var jsonString = jsonStringTask.Result;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM