C#HttpClient POST';异步的

C#HttpClient POST';异步的,c#,asynchronous,httpclient,C#,Asynchronous,Httpclient,我想发送一个http post,它可能需要几秒钟的时间来回复,而不会冻结我的UI。目前,当调用该方法时,该代码只是挂起我的应用程序 我做错了什么?我如何实现我的目标 private async Task<string> DoHttpClientPost(string method, IDictionary<string, object> args = null) { { HttpClientHandler handler =

我想发送一个http post,它可能需要几秒钟的时间来回复,而不会冻结我的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;
    }
private异步任务DoHttpClientPost(字符串方法,IDictionary args=null)
{
{
HttpClientHandler handler=新的HttpClientHandler()
{
AutomaticDecompression=DecompressionMethods.GZip | DecompressionMethods.Deflate
};
handler.Proxy=null;
HttpResponseMessage响应;
使用(var myHttpClient=newhttpclient(handler))
{
myHttpClient.DefaultRequestHeaders.ExpectContinue=false;
添加(“接受字符集”、“ISO-8859-1、utf-8”);
myHttpClient.DefaultRequestHeaders.Add(APPKEY_头,CustomHeaders.GetValues(APPKEY_头));
myHttpClient.DefaultRequestHeaders.Add(会话\令牌\头,CustomHeaders.GetValues(会话\令牌\头));
myHttpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json rpc”);
var call=newjsonrequest{Method=Method,Id=1,Params=args};
var jsonObject=JsonConvert.Serialize(调用);
var content=newstringcontent(jsonObject.ToString(),Encoding.UTF8,“application/json-rpc”);
response=wait myHttpClient.PostAsync(新Uri(端点),内容);
}
Console.WriteLine(\n使用参数“+JsonConvert.Serialize(args)”调用“+method+”;
字符串jsonResponse=await response.Content.ReadAsStringAsync();
返回jsonResponse;
}
}
公共T调用(字符串方法,IDictionary args=null)
{
if(方法==null)
抛出新的ArgumentNullException(“方法”);
if(method.Length==0)
抛出新ArgumentException(null,“方法”);
var jsonString=DoHttpClientPost(方法,args);
var jsonResult=JsonConvert.Deserialize(jsonString);
返回jsonResult.Result;
}
这是你的罪魁祸首。如果从UI线程对任务调用
.Result
,它将挂起


您需要一路异步-因此
调用
应该是异步的,并返回一个
任务
并等待
DoHttpClientPost
调用,调用方应该是异步的等等。等等。您必须做两个更改

从中修改此行

response = await myHttpClient.PostAsync(new Uri(EndPoint), content);
var jsonString = DoHttpClientPost(method, args).Result;

看起来您的意图是等待post调用完成并返回结果,因此请从中修改此行

response = await myHttpClient.PostAsync(new Uri(EndPoint), content);
var jsonString = DoHttpClientPost(method, args).Result;


谢谢你的帮助。
var jsonStringTask = DoHttpClientPost(method, args);
jsonStringTask.Wait(); //wait for http post call to complete.

var jsonString = jsonStringTask.Result;