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采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
随机推荐
- 洛谷P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers
题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人.然而,在任何一群朋友中 ...
- 【CF1015C】Songs Compression(贪心)
题意: 给定n和m,n组(a[i],b[i]),每一组a[i]可以压缩为b[i],求最少只需要压缩几个,使得m可以存下所有数据,无解输出-1 思路:按差贪心,排序 #include<cstdio ...
- 线程间通过PostMessage通信
1.查看TMS项目中的相关实例 ::PostMessage(hWnd, WM_USER_MSG_REFRESH_UI, (WPARAM)UMP_REFRESH_MEMBER_INFO, 0); 参考文 ...
- C语言标准库
共15个,请查看,在linux下的目录位/usr/share/include assert.h ctype.h errno.h float.h limits.h locale.h math.h set ...
- Django迁移数据库
我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建 为了让 Django 完成翻译,创建 ...
- SQL Server 监控系列 —— 二
http://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html
- 作为一个新人,怎样学习嵌入式Linux?
作为一个新人,怎样学习嵌入式Linux? 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).尝试着写一些C语言竞赛的题目.它们是纯 ...
- python--文件处理1
1. 读取文件 方法: all_the_text = open('thefile.txt').read() 但是为了安全起见还是给打开的文件对象指定一个名字,这样在完成之后可以迅速关掉,防止无 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律三十 IT人成功之道-總結
時間過得相當快!很榮幸有這個機會能夠在iT邦幫忙鐵人賽的社群網站上,和所有IT人分享「邁向IT專家成功之路的三十則鐵律」,其主要目的只是單純希望每一位辛苦的IT工作者,盡可能可以從這一些經驗分享中,將 ...
- 纯CSS3美化radio和checkbox
如题,主要通过CSS3来实现将radio和checkbox美化的效果.可是兼容性并非非常好,PC端仅仅支持chrome浏览器(IE和Firefox測试不行,其它没有很多其它測试).然后微信端和QQ端訪 ...