NET 并发编程
场景并发调用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 并发编程的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
随机推荐
- Office 365 切换语言设置
The steps of changing the language: Click “Setting ”>”Office 365 Setting” ...
- OpenJudge 东方14ACM小组 / 20170123 06:Challenge 3
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 262144kB 描述 给一个长为N的数列,有M次操作,每次操作是以下两种之一: (1)修改数列中的一个数 (2)求 ...
- HTTP基础认证Basic Authentication
HTTP基础认证Basic Authentication Basic Authentication是一种HTTP访问控制方式,用于限制对网站资源的访问.这种方式不需要Cookie和Session,只需 ...
- java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page pagehelper报错无法类型转化。
报错信息: 严重: Servlet.service() for servlet [springmvc] in context with path [] threw exception [Request ...
- BZOJ1003物流運輸 DP + SPFA
@[DP, SPFA] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运 ...
- see
Description 问从点(0,0)能看到点(0,0)和(n,n)之间的矩形的多少个整数点,看到(x,y)代表点(0,0)和点(x,y)间没有其他整数点,如看不到(2,4)因为中间有点(1,2) ...
- IntelliJ IDEA重构技巧收集
https://segmentfault.com/a/1190000002488608(重命名文件) http://www.jianshu.com/p/ab298b46bf50(快速生成方法) htt ...
- android特效集合
https://github.com/Trinea/android-open-project http://www.cnblogs.com/hawkon/p/3593709.html http://i ...
- Swagger学习和实践
Swagger学习和实践 学习了:https://www.cnblogs.com/zxtceq/p/5530396.html swagger 英 [ˈswægə(r)] 美 [ˈswæɡɚ] vi.昂 ...
- OpenGL之路(七)为立方体加入丰富色彩
在立方体的六个面贴上不同的颜色,假设想达到混合颜色的效果,能够參照立方体的前面代码在每一行前都加上颜色 代码例如以下 #include <gl/glut.h> #pragma commen ...