C#HttpClient POST';异步的
我想发送一个http post,它可能需要几秒钟的时间来回复,而不会冻结我的UI。目前,当调用该方法时,该代码只是挂起我的应用程序 我做错了什么?我如何实现我的目标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 =
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;