场景并发调用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);
}

最新文章

  1. 关于Jquery获取Table中td内的内容
  2. HDU 4857 Couple doubi(找循环节)
  3. 1166 矩阵取数游戏[区间dp+高精度]
  4. QT_校园导航(绘制路线已实现)_Updata_详细注释
  5. CentOS7配置Nodejs环境安装记录
  6. Jekyll搭建过程详解
  7. [转]Qt5.0 连接 webkit 错误解决
  8. 谈谈数据库中MyISAM与InnoDB区别 针对业务类型选择合适的表
  9. DOM元素拖拽效果
  10. 使用Go和Let&#39;s Encrypt证书部署HTTPS
  11. 移动端video不全屏播放
  12. 第一次AOP,附上使用DEMO,可用在简单生产环境了
  13. TP5创建动态数据表
  14. 基于VC++的网络扫描器设计与实现
  15. Vmware Workstation - linux系统下 VmTools 安装
  16. 转自:stuff字符串拼接方法
  17. flume常见异常汇总以及解决方案
  18. unity加载ab后,场景shader不起效问题(物件表现黑色)
  19. python 之字符编码
  20. WPF,ListView设置分组

热门文章

  1. POJ 3037 Skiing
  2. 解决 unresolved external symbol 无法解析 _send@16(转)
  3. ROS学习网址【原创】
  4. js、jq平时积累
  5. mysql数据库引擎(InnoDB MyISAM)
  6. BZOJ——2438: [中山市选2011]杀人游戏
  7. 树讲解——紧急集合(lca)
  8. about乘法逆元
  9. Java中泛型T和Class&lt;T&gt;以及Class&lt;?&gt;的理解(转)
  10. android_浅析canvas的save()和restore()方法