zoukankan      html  css  js  c++  java
  • 【C#基础】并发集合

    局部变量不能被共享。

    不变的集合很容易在多个线程中使用,因为他们不能改变。如果希望使用应在多个线程中改变的集合。

    .Net在命名空间System.Collections.Concurrent中提供了几个线程安全的集合类。

    线程安全的集合可防止多个线程以相互冲突的方式访问集合。

    为了对集合进行线程安全的访问,定义了IProducerConsumerCollection<T>接口

    这个接口最重要的方法是TryAdd()和TryTake()。TryAdd()方案尝试给集合添加一项,但如果集合禁止添加项,这个操作就可能失败。为了给出相关信息,TryAdd()方法返回一个布尔值,以说明操作是成功还是失败。

    TryTake()也可以以这种方式工作,以通知调用者操作是成功还是失败,并在操作成功时返回集合中的项。

    ConcurrentQueue<T>--这个集合类用一种免锁定的算法实现,使用在内部合并到一个链表中的32项数组。访问队列元素的方法有Enqueue()、TryDequeue()、和TryPeek()。和Queue<T>类的方法类似,只是给可能调用失败的方法加上了前缀Try。因为这个类实现了IProducerConsumerCollection<T>接口,所以TryAdd()和TryTake()方法仅调用Enqueue()和TryDequeue()方法。

    ConcurrentStack<T>---非常类似于ConcurrentQueue<T>类,只是带有另外的元素访问方法,

    ConcurrentStack<T>类定义了Push()、PushRange()、TryPeek()、TryPop()以及TryPopRange()方法。在内部这个类使用其元素的链表。

    ConcurrentBag<T>--该类没有定义添加或提取项的任何顺序。这个类使用一个把线程映射到内部使用的数组上的概念,因此尝试减少锁定。访问元素的方法有Add()、TryPeek()和TryTake()。

    ConcurrentDictionary<TKey,TValue>--这是一个线程安全的键值集合。TryAdd()、TryGetValue()、

    TryRemove()和TryUpdate()方法以非阻塞的方式访问成员。因为预算基于键和值,所以ConcurrentDictionary<Tkey,TValue>没哟实现IProducerConsumerCollention<T>。

    BlockingCollection<T>--这个集合可以添加或提取元素之前,会阻塞线程并一直等待。

    BlockingCollection<T>集合提供了一个接口,以使用Add()和Take()方法来添加和删除元素。

    这些方法会阻塞线程,一致等到任务可以执行位置。Add()方案有一个 重载版本,其中可以给该重载版本传递一个CancellationToken令牌。这个令牌允许取消被阻塞的调用。如果不希望线程无限期地等待下去,且不希望从外部取消调用,就可以使用TryAdd()和TryTake()方法,在这些方法中,也可以指定一个超时值,它表示在调用失败之前应阻塞线程和等待的最长时间。

    ConcurrentXXX集合时线程安全的。如果某个动作不适合用于线程的当前状态,他们就返回false,

    在继续之前,总是需要确认添加或提取元素知否成功。不能相信集合会完成任务。

     BlockingCollection<T>是对实现了IProducerConsumerCollection<T>接口的任意类的修饰器,

    它默认使用ConcurrentQueue<T>类,还可以给构造函数传递任何其他实现了IProducerConsumerCollection<T>接口的类,例如,ConcurrentBag<T>和ConcurrentStack<T>.

    二:创建管道

    将这些并发集合类用于管道是一种很好的应用。一个任务像一个集合类写入一些内容,同时另一个任务从该集合中读取内容。

  • 相关阅读:
    求10个随机数的最大值、最小值、和、平均值
    设计并编写代码自动格斗类游戏
    用while实现阶乘
    安卓第三次作业
    第二次作业
    第一次作业
    第四次作业
    dialog
    用画图的方法理解原型对象和原型链,事半功倍今晚不加班
    【学习笔记】浅析Promise函数
  • 原文地址:https://www.cnblogs.com/SignX/p/11385789.html
Copyright © 2011-2022 走看看