zoukankan      html  css  js  c++  java
  • 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 = 0; i < 10; 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(0, 100, (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(0, 100, (i) =>
                {
                    Console.WriteLine(i);
                    queue.Enqueue( CommonHelper.PostAsync<string>(url, "test" + i));
                    
                });
          
                while (true)
                {
                    if (dic.Count > 0)
                    {
                        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(0, 100, (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);
                }
  • 相关阅读:
    洞察移动互联网的未来,互联网营销 狼人:
    Twitter模式:改造140字,互联网营销 狼人:
    如何改善网站的“跳出率”,互联网营销 狼人:
    Google如何设定目标和衡量成功,互联网营销 狼人:
    像Google一样开会,互联网营销 狼人:
    互联网创业六大经典创业理论,互联网营销 狼人:
    当你输入一个网址的时候,实际会发生什么?,互联网营销 狼人:
    有了HTML5,Flash还能走多远?,互联网营销 狼人:
    FlashPlayer 10.1将灭掉HTML5,互联网营销 狼人:
    初始化文件理解 Cocos2D 如何绘制帧
  • 原文地址:https://www.cnblogs.com/tianboblog/p/6685958.html
Copyright © 2011-2022 走看看