NET 并发编程
2024-08-30 06:57:59
场景并发调用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);
}
最新文章
- 关于Jquery获取Table中td内的内容
- HDU 4857 Couple doubi(找循环节)
- 1166 矩阵取数游戏[区间dp+高精度]
- QT_校园导航(绘制路线已实现)_Updata_详细注释
- CentOS7配置Nodejs环境安装记录
- Jekyll搭建过程详解
- [转]Qt5.0 连接 webkit 错误解决
- 谈谈数据库中MyISAM与InnoDB区别 针对业务类型选择合适的表
- DOM元素拖拽效果
- 使用Go和Let&#39;s Encrypt证书部署HTTPS
- 移动端video不全屏播放
- 第一次AOP,附上使用DEMO,可用在简单生产环境了
- TP5创建动态数据表
- 基于VC++的网络扫描器设计与实现
- Vmware Workstation - linux系统下 VmTools 安装
- 转自:stuff字符串拼接方法
- flume常见异常汇总以及解决方案
- unity加载ab后,场景shader不起效问题(物件表现黑色)
- python 之字符编码
- WPF,ListView设置分组
热门文章
- POJ 3037 Skiing
- 解决 unresolved external symbol 无法解析 _send@16(转)
- ROS学习网址【原创】
- js、jq平时积累
- mysql数据库引擎(InnoDB MyISAM)
- BZOJ——2438: [中山市选2011]杀人游戏
- 树讲解——紧急集合(lca)
- about乘法逆元
- Java中泛型T和Class<;T>;以及Class<;?>;的理解(转)
- android_浅析canvas的save()和restore()方法