项目中遇到了这样的问题:
第一次 :HttpResponseMessage response = await httpClient.PostAsync(url, null); 发送了一个 post 异步请求 , 操作了一个 datatable 的数据
第二次: 又发了一个 post 异步请求, 用到了第一步中的 datatable 的数据
刚开始都是异步方式调用, 发现最终结果有时候对, 有时候不对, 调试才发现是两次异步请求之间是相关的, 个人觉得有点类似多线程之间数据没有进行同步, 所以网上查了很多资料, 终于找到以下方法圆满解决问题.
HttpClient 中异步方法的同步调用 在 System.NET.Http 中, 提供了使用 Http 与远程服务器通讯的 httpClient, 但是里面都是异步方法, 有时候我们并不需要使用异步操作. 这个时候可以使用如下的方式来进行同步调用.
同步调用的这段代码是引用别人的.
- class Program
- {
- static void Main(string[] args)
- {
- string _address = "http://api.worldbank.org/countries?format=json";
- // Create an HttpClient instance
- HttpClient client = new HttpClient();
- // 远程获取数据
- var task = client.GetAsync(_address);
- var rep = task.Result;// 在这里会等待 task 返回.
- // 读取响应内容
- var task2 = rep.Content.ReadAsStringAsync();
- var ret = task2.Result;// 在这里会等待 task 返回.
- Console.WriteLine(ret);
- Console.WriteLine("Hit ENTER to exit...");
- Console.ReadLine();
- }
- }
下面再把 Winform 中 HttpClient 应用附上:
- HttpClient httpClient = new HttpClient();
- string url = "******";
- HttpResponseMessage response = await httpClient.PostAsync(url, null);
- response.EnsureSuccessStatusCode();
- string resultStr = await response.Content.ReadAsStringAsync();
var dev = JsonConvert.DeserializeObject<List < 实体类名 >>(resultStr);
这个是不带参数的 post 请求, 解析的话要引用 Newtonsoft.JSON.dll, 可以直接把 JSON 数据转成需要的实体类类型, 然后就不必说了.
带参数的应用:
- private async void HttpPost() {
- HttpClient httpClient = new HttpClient();
- var data = new Dictionary<string, string>();
- data["username"] = "cs_admin";
- data["password"] = "cs_12345";
- var content = new FormUrlEncodedContent(data);
- string url = "http://localhost:8080/server-http/http/emulator/post";
- HttpResponseMessage response = await httpClient.PostAsync(url, content);
- response.EnsureSuccessStatusCode();
- string resultStr = await response.Content.ReadAsStringAsync();
- Console.WriteLine(resultStr);
- }
来源: http://www.bubuko.com/infodetail-2870343.html