C# HttpClient POST'ing 异步

标签 c# asynchronous httpclient

我想发送一个 http 帖子,它可能需要几秒钟才能回复而不卡住我的 UI,目前这段代码只是在调用该方法时挂起我的应用程序。

我哪里做错了,我该如何实现我的目标?

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;

这是你的罪魁祸首。如果您调用 .Result在 UI 线程的任务上它将挂起。

你需要一直异步 - 所以 Invoke应该是异步的并返回 Task<T>并等待 DoHttpClientPost调用,调用者应该是异步的等等等等。

关于C# HttpClient POST'ing 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879285/

相关文章:

php - Android Php Mysql 插入重复

监听数据时出现 HttpClientResponse 错误

c# - 如何从服务总线主题死信队列中读取C#?

C# 性能好奇心

c# - 为什么 C#/CLR 不支持方法重写协方差/反方差?

Node.js - 如何使用回调调用异步函数?

android - URLConnection 或 HTTPClient : Which offers better functionality and more efficiency?

c# - 以编程方式创建 'SharePoint Solution'

javascript - 在 Angular $http 调用中使用 then/catch

javascript - 什么函数被放入 Node Js 和 JS 的事件循环中