BlockingCollection

  • 该集合是对泛型接口IProducerConsumerCollection实现的一个高级封装。其中有很多管道场景,即当你有一些操作需要使用之前计算的结果。

  • BlockingCollection支持如下功能:

    • 分块
    • 调整内部集合容量
    • 取消集合操作
    • 从多个块集合中获取元素

DEMO:在单线程的环境中使用通用字典与使用通用字典的性能

结论

可以发现使用ConcurrentDictionary写操作比使用锁的通用字典要慢很多,而读操作则更快些。因此如果对字典需要大量的线程安全的读操作,则ConcurrentDictionary是更好的选择。

图片

BlockingCollect - 图1

代码

  1. class Program
  2. {
  3. const string Item = "";
  4. public static string CurrentItem;
  5. static void Main(string[] args)
  6. {
  7. var concurrentDicrionary=new ConcurrentDictionary<int ,string>();
  8. var dictionary=new Dictionary<int ,string>();
  9. var sw = new Stopwatch();
  10. sw.Start();
  11. for (int i = 0; i < 1000000; i++)
  12. {
  13. lock(dictionary)
  14. {
  15. dictionary[i]=Item;
  16. }
  17. }
  18. sw.Stop();
  19. Console.WriteLine("写dictionary的时间"+sw.Elapsed);
  20. sw.Restart();
  21. for (int i = 0; i < 1000000; i++)
  22. {
  23. concurrentDicrionary[i] = Item;
  24. }
  25. sw.Stop();
  26. Console.WriteLine("写并发集合concurrentDicrionary的时间:" + sw.Elapsed);
  27. sw.Restart();
  28. for (int i = 0; i < 1000000; i++)
  29. {
  30. lock(dictionary)
  31. {
  32. CurrentItem = dictionary[i];
  33. }
  34. }
  35. sw.Stop();
  36. Console.WriteLine("读dictionary的时间" + sw.Elapsed);
  37. sw.Restart();
  38. for (int i = 0; i < 1000000; i++)
  39. {
  40. CurrentItem=concurrentDicrionary[i];
  41. }
  42. sw.Stop();
  43. Console.WriteLine("读并发集合concurrentDicrionary的时间:" + sw.Elapsed);
  44. Console.ReadKey();
  45. }
  46. }