场景并发调用API

1、简单封装httpclient

 public class CommonHelper
{
private static readonly HttpClient _httpClient; static CommonHelper()
{
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
} public static async Task<T> PostAsync<T>(string url, object request)
{
var response = await _httpClient.PostAsJsonAsync(url, request); return await response.Content.ReadAsAsync<T>();
}
}

可参考:http://www.cnblogs.com/dudu/p/csharp-httpclient-attention.html

2、简单api服务

 public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
} // GET api/values/5
public string Get(int id)
{
return "value";
} // POST api/values
public string Post([FromBody]string value)
{
return value; } // PUT api/values/5
public void Put(int id, [FromBody]string value)
{
} // DELETE api/values/5
public void Delete(int id)
{
}
}

3、for循环调用:

_httpClient.PostAsJsonAsync是线程安全的,通过打印结果可以看出:
            Dictionary<int, Task<string>> tasks = new Dictionary<int, Task<string>>();
for (int i = ; i < ; i++)
{
tasks.Add(i, CommonHelper.PostAsync<string>(url, "test" + i));
} foreach (var task in tasks)
{
Console.WriteLine(task.Key + ":" + task.Value.Result);
}

4、并发调用,

Dictionary中字典肯定会报异常,因为它不是线程安全的;
  Parallel.For(, , (i) =>
{
Console.WriteLine(i); tasks.Add(i, CommonHelper.PostAsync<string>(url, "test" + i));
});

5、采用 Queue 或是 ConcurrentDictionary

 var queue = new Queue<Task<string>>();
var dic = new ConcurrentDictionary<int, Task<string>>();
Parallel.For(, , (i) =>
{
Console.WriteLine(i);
queue.Enqueue( CommonHelper.PostAsync<string>(url, "test" + i)); });
      
while (true)
{
if (dic.Count > )
{
var value = queue.Dequeue();
Console.WriteLine(value.Result);
}
}

Queue可以作为生产者、消费者模式使用:参考  http://www.cnblogs.com/chengxiaohui/articles/5672768.html

ConcurrentDictionary方式:

 var queue = new Queue<Task<string>>();
var dic = new ConcurrentDictionary<int, Task<string>>();
Parallel.For(, , (i) =>
{
Console.WriteLine(i);
//queue.Enqueue( CommonHelper.PostAsync<string>(url, "test" + i));
dic.TryAdd(i, CommonHelper.PostAsync<string>(url, "test" + i));
}); foreach (var item in dic)
{
Console.WriteLine(item.Key + ":" + item.Value.Result);
}

NET 并发编程的更多相关文章

  1. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  2. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  3. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  4. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  5. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  6. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  7. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  8. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  9. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  10. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

随机推荐

  1. polyfill for Function--源码

    /** * polyfill for Function */ // from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer ...

  2. [LeetCode] Sort Colors 只有3个类型的排序

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  3. 转 手把手教你最简单的开源项目托管GitHub入门教程

    传送门 自从google code关闭了下载服务了之后,GitHub作为了目前最好用的免费开源项目托管站点,众多开源项目都托管在github,其中不乏著名的播放器MPC-HC. 不习惯于英文的朋友,难 ...

  4. dedecms--将静态页面转化为动态页面

    最近在用dedecms二次开发项目,需要对文章内容页设置权限,会员未登录不允许查看,这个需要先在后台设置将静态页面转化为动态页面 具体步骤: 1:将主页设置为动态浏览 2:进入后台→系统→SQL命令行 ...

  5. AC日记——网络最大流 洛谷 P3376

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  6. numpy常用函数学习

    目录numpy常用函数学习点乘法线型预测线性拟合裁剪.压缩和累乘相关性多项式拟合提取符号数组杂项点乘法该方法为数学方法,但是在numpy使用的时候略坑.numpy的点乘为a.dot(b)或numpy. ...

  7. MySQL中limit与max同时使用时查询为空的情况

    一般情况下使用limit进行分页时通常是第一页就用max和min这些函数去求值,这样的情况是正常的,但是如果limit去到了第二页的时候发现这样用是不行的,原因未知! 修改的方式如下,适合大部分: , ...

  8. SpringBoot中@EnableAutoConfiguration注解用法收集

    参考: http://blog.csdn.net/xiaoyu411502/article/details/52770723 https://docs.spring.io/spring-boot/do ...

  9. ui develop

    https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/DesigningaUserInt ...

  10. nopCommerce从无到有01-初探nopCommerce

    nopCommerce框架的基本结构: 该结构可以参考DDD(领域驱动设计)模式. (注:上图源自他人文章,具体出处不祥,在此引用,感谢原创) nopcommerce官方地址:http://www.n ...