• ConcurrentQueue 是完全无锁的,能够支持并发的添加元素,先进先出

TryDequeue 尝试移除并返回

TryPeek 尝试返回但不移除

Enqueus(): 向队列中加入元素

例子

  1. class Program
  2. {
  3. private static object o = new object();
  4. /*定义 Queue*/
  5. private static Queue<Product> _Products { get; set; }
  6. private static ConcurrentQueue<Product> _ConcurrenProducts { get; set; }
  7. /* coder:释迦苦僧
  8. * 代码中 创建三个并发线程 来操作_Products 和 _ConcurrenProducts 集合,每次添加 10000 条数据 查看 一般队列Queue 和 多线程安全下的队列ConcurrentQueue 执行情况
  9. */
  10. static void Main(string[] args)
  11. {
  12. Thread.Sleep(1000);
  13. _Products = new Queue<Product>();
  14. Stopwatch swTask = new Stopwatch();
  15. swTask.Start();
  16. /*创建任务 t1 t1 执行 数据集合添加操作*/
  17. Task t1 = Task.Factory.StartNew(() =>
  18. {
  19. AddProducts();
  20. });
  21. /*创建任务 t2 t2 执行 数据集合添加操作*/
  22. Task t2 = Task.Factory.StartNew(() =>
  23. {
  24. AddProducts();
  25. });
  26. /*创建任务 t3 t3 执行 数据集合添加操作*/
  27. Task t3 = Task.Factory.StartNew(() =>
  28. {
  29. AddProducts();
  30. });
  31. Task.WaitAll(t1, t2, t3);
  32. swTask.Stop();
  33. Console.WriteLine("List<Product> 当前数据量为:" + _Products.Count);
  34. Console.WriteLine("List<Product> 执行时间为:" + swTask.ElapsedMilliseconds);
  35. Thread.Sleep(1000);
  36. _ConcurrenProducts = new ConcurrentQueue<Product>();
  37. Stopwatch swTask1 = new Stopwatch();
  38. swTask1.Start();
  39. /*创建任务 tk1 tk1 执行 数据集合添加操作*/
  40. Task tk1 = Task.Factory.StartNew(() =>
  41. {
  42. AddConcurrenProducts();
  43. });
  44. /*创建任务 tk2 tk2 执行 数据集合添加操作*/
  45. Task tk2 = Task.Factory.StartNew(() =>
  46. {
  47. AddConcurrenProducts();
  48. });
  49. /*创建任务 tk3 tk3 执行 数据集合添加操作*/
  50. Task tk3 = Task.Factory.StartNew(() =>
  51. {
  52. AddConcurrenProducts();
  53. });
  54. Task.WaitAll(tk1, tk2, tk3);
  55. swTask1.Stop();
  56. Console.WriteLine("ConcurrentQueue<Product> 当前数据量为:" + _ConcurrenProducts.Count);
  57. Console.WriteLine("ConcurrentQueue<Product> 执行时间为:" + swTask1.ElapsedMilliseconds);
  58. Console.ReadLine();
  59. }
  60. /*执行集合数据添加操作*/
  61. static void AddProducts()
  62. {
  63. Parallel.For(0, 30000, (i) =>
  64. {
  65. Product product = new Product();
  66. product.Name = "name" + i;
  67. product.Category = "Category" + i;
  68. product.SellPrice = i;
  69. lock (o)
  70. {
  71. _Products.Enqueue(product);
  72. }
  73. });
  74. }
  75. /*执行集合数据添加操作*/
  76. static void AddConcurrenProducts()
  77. {
  78. Parallel.For(0, 30000, (i) =>
  79. {
  80. Product product = new Product();
  81. product.Name = "name" + i;
  82. product.Category = "Category" + i;
  83. product.SellPrice = i;
  84. _ConcurrenProducts.Enqueue(product);
  85. });
  86. }
  87. }
  88. class Product
  89. {
  90. public string Name { get; set; }
  91. public string Category { get; set; }
  92. public int SellPrice { get; set; }
  93. }