项目中遇到了这样的问题:

第一次 :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);
}

C# 中HttpClient的使用中同步异步问题的更多相关文章

  1. 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。

    分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...

  2. socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

    一.举个打电话的例子: 阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞   nonblock   是指,你拨通 ...

  3. UML建模中简单消息、同步消息和异步消息

    两种消息在UML图中的表示方法如图: 1.同步方式 两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的.发送程序和接收程序都必须一直处于运行状态,并且随时做好相互通信的准备. 发送程序 ...

  4. JS中的同步异步问题

    <script> /* * JS 是单线程 * 同步 异步 * 常见的异步 * 1.定时器 * 2.事件绑定 * 3.ajax请求(一般的都是异步) * 4.回调函数也可以理解成 异步 * ...

  5. JS中的同步异步编程

    首先我们先看看同步与异步的定义,及浏览器的执行机制,方便我们更好地理解同步异步编程. 浏览器是多线程的,JS是单线程的(浏览器只分配一个线程来执行JS)   进程大线程小:一个进程中包含多个线程,例如 ...

  6. 进程?线程?多线程?同步?异步?守护线程?非守护线程(用户线程)?线程的几种状态?多线程中的方法join()?

    1.进程?线程?多线程? 进程就是正在运行的程序,他是线程的集合. 线程是正在独立运行的一条执行路径. 多线程是为了提高程序的执行效率.2.同步?异步? 同步: 单线程 异步: 多线程 3.守护线程? ...

  7. java中同步异步阻塞和非阻塞的区别

    同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等).但是一般而言,我们在说同步.异步的时候,特 ...

  8. IO中同步异步,阻塞与非阻塞 -- 通俗篇

    一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例 ...

  9. .Net Core WebAPI 基于Task的同步&异步编程快速入门

    .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...

随机推荐

  1. Python 使用sqlalchemy操作MYSQL

    1. 安装sqlalchemy库 SQL操作引擎可能需要pymysql,故要安装如下两个程序 pip install sqlalchemy pip instal pymysql

  2. 【leetcode】283. Move Zeroes

    problem 283. Move Zeroes solution 先把非零元素移到数组前面,其余补零即可. class Solution { public: void moveZeroes(vect ...

  3. 洛谷 P3373:【模板】线段树 2(区间更新)

    题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别 ...

  4. set_union和set_intersection

    set_union使用方法: set_union(集合A起始地址,集合A终止地址,集合B起始地址,集合B终止地址,插入C集合中(操作:inserter(C.C.begin()))); set_inte ...

  5. HDU 1873 看病要排队 优先队列

    Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  6. Laravel学习--时间

    date("Y-m-d H:i:s"); list($usec, $sec) = explode(" ", microtime()); $time = (flo ...

  7. spring模拟ioc

    非spring 开发 public class UserService { private UserDao userDao=new UserDaoImpl(); public void addUser ...

  8. 一个天气的微服务springcloud

    1.开发环境 jdk8  和 gradle 4. ---------------搭建一个天气预报系统 1.bootstrap就是一堆样式文件,首先有html标签,然后加上各种样式以后就变得好看了2.j ...

  9. nginx负载均衡算法

    配置方式 NGINX配置负载均衡主要是在nginx.conf文件中里upstream模块 1.upstream模块应放于nginx.conf配置的http{}标签内2.upstream模块默认算法是w ...

  10. shell dict 操作

    shell 读取文件,利用dict 合并第一列 . #!/bin/bash result_file="a" declare -A mydict total=`cat ${resul ...