最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的并發(fā)集合Concurrent類(lèi)

 更新時(shí)間:2022年05月19日 09:34:42   作者:springsnow  
這篇文章介紹了C#中的并發(fā)集合Concurrent類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、概述:

System.Collections.Concurrent 命名空間提供多個(gè)線(xiàn)程安全集合類(lèi)。

當(dāng)有多個(gè)線(xiàn)程并發(fā)訪問(wèn)集合時(shí),應(yīng)使用這些類(lèi)代替 System.Collections 和 System.Collections.Generic 命名空間中的對(duì)應(yīng)類(lèi)型。

為了對(duì)集合進(jìn)行線(xiàn)程安全的訪問(wèn),定義了 IProducerConsumerCollection接口。這個(gè)接口中最重 要的方法是TryAdd()和TryTake()。

  • TryAdd()方法嘗試給集合添加一項(xiàng),但如果集合禁止添加項(xiàng),這個(gè)操作就可能失敗。為了給出相關(guān)信息,TryAdd()方法返回一個(gè)布爾值,以說(shuō)明操作是成功還是失敗。
  • TryTake()方法也以這種方式工作,以通知調(diào)用者操作是成功還是失敗,并在操作成功時(shí)返回集合中的項(xiàng)。

二、空間中包含的類(lèi)

ConcurrentXXX :這些集合是線(xiàn)程安全的,如果某個(gè)動(dòng)作不適用于線(xiàn)程的當(dāng)前狀態(tài),它們就返回false。在繼續(xù)之前,總是霈要確認(rèn)添加或提取元素是否成功。不能相信集合會(huì)完成任務(wù)。

1、ConcurrentQueue 隊(duì)列

這個(gè)集合類(lèi)用一種免鎖定的算法實(shí)現(xiàn),使用在內(nèi)部合并到一個(gè)鏈表中的32項(xiàng)數(shù)組。

訪問(wèn)隊(duì)列元素的方法有Enqueue()、TryDequeue()和TryPeek()。這些方法的命名非常類(lèi)似于前面Queue類(lèi)的方法,只是給可能調(diào)用失敗的方法加上了前綴Try。

因?yàn)檫@個(gè)類(lèi)實(shí)現(xiàn)了IProducerConsumerCollection接口,所以 TryAdd()和 TryTake()方法僅調(diào)用 Enqueue()和 TryDequeue()方法。

2、ConcurrentStack 堆棧

非常類(lèi)似于ConcurrentQueue類(lèi),只是帶有另外的元素訪問(wèn)方法。

ConcurrcntStack類(lèi)定義了 Push()、PushRange()、TryPeek()、TiyPop()和 TryPopRange() 方法。在內(nèi)部這個(gè)類(lèi)使用其元素的鏈表。

3、ConcurrentBag 包

該類(lèi)沒(méi)有定義添加或提取項(xiàng)的任何順序。這個(gè)類(lèi)使用一個(gè)把線(xiàn)程映射到內(nèi)部使用的數(shù)組上的概念,因此嘗試減少鎖定。

訪問(wèn)元素的方法有Add()、TryPeek()和 TryTake()。

4、ConcurrentDictionary 字典

——這是一個(gè)線(xiàn)程安全的鍵值集合。

TryAdd()、TryGetValue()、TryRemove()和TryUpdate()方法以非阻塞的方式訪問(wèn)成員。

因?yàn)樵鼗阪I和值, 所以 ConcurrentDictionary沒(méi)有實(shí)現(xiàn) IProducerConsumerCollection。

5、BlockingCollection 集合

這個(gè)集合在可以添加或提取元素之前,會(huì)阻塞線(xiàn)程并一直等待。

BlockingCollection集合提供了一個(gè)接口,以使用Add()和Take()方法來(lái)添加和刪除元素。 這些方法會(huì)阻寒線(xiàn)程,一直等到任務(wù)可以執(zhí)行為止。

Add()方法有一個(gè)重載版本,其中可以給該重載版本傳遞一個(gè)CancellationToken令牌。

這個(gè)令牌允許取消被阻塞的調(diào)用。如果不希望線(xiàn)程無(wú)限期地等待下去,且不希望從外部取消調(diào)用,就可以使用TryAdd()和 TryTake()方法,在這些方法中,也可以指定一個(gè)超時(shí)值,它表示在調(diào)用失敗之前應(yīng)阻塞線(xiàn)程和等待的最長(zhǎng)時(shí)間。

6、BlockingCollection 阻塞式集合

這是對(duì)實(shí)現(xiàn)了 IProducerConsumerCollection接口的任意類(lèi)的修飾器,它默認(rèn)使用ConcurrentQueue類(lèi)。

還可以給構(gòu)造函數(shù)傳遞任何其他實(shí)現(xiàn)了 IProducerConsumerCollection 接口的類(lèi)。

下面的代碼示例簡(jiǎn)單演示了使用BlockingCollection類(lèi)和多個(gè)線(xiàn)程的過(guò)程。

一個(gè)線(xiàn)程是生成器,它使用Add()方法給集合寫(xiě)入元素,另一個(gè)線(xiàn)程是使用者,它使用Take()方法從集合中提取元素:

internal static BlockingCollection<int> _TestBCollection;

class ThreadWork1  // 生產(chǎn)者
{
    public ThreadWork1()
    { }
    public void run()
    {
        System.Console.WriteLine("ThreadWork1 run { ");
        for (int i = 0; i < 100; i++)
        {
            System.Console.WriteLine("ThreadWork1 producer: " + i);
            _TestBCollection.Add(i);
        }
        _TestBCollection.CompleteAdding();
        System.Console.WriteLine("ThreadWork1 run } ");
    }
}

class ThreadWork2  // 消費(fèi)者
{
    public ThreadWork2()
    { }
    public void run()
    {
        int i = 0;
        int nCnt = 0;
        bool IsDequeuue = false;
        System.Console.WriteLine("ThreadWork2 run { ");
        while (!_TestBCollection.IsCompleted)
        {
            IsDequeuue = _TestBCollection.TryTake(out i);
            if (IsDequeuue)
            {
                System.Console.WriteLine("ThreadWork2 consumer: " + i * i + "   =====" + i);
                nCnt++;
            }
        }
        System.Console.WriteLine("ThreadWork2 run } ");
    }
}
static void StartT1()
{
    ThreadWork1 work1 = new ThreadWork1();
    work1.run();
}
static void StartT2()
{
    ThreadWork2 work2 = new ThreadWork2();
    work2.run();
}
static void Main(string[] args)
{
    Task t1 = new Task(() => StartT1());
    Task t2 = new Task(() => StartT2());
    _TestBCollection = new BlockingCollection<int>();//可以跟容量
    Console.WriteLine("Sample 4-4 Main {");
    Console.WriteLine("Main t1 t2 started {");
    t1.Start();
    t2.Start();
    Console.WriteLine("Main t1 t2 started }");
    Console.WriteLine("Main wait t1 t2 end {");
    Task.WaitAll(t1, t2);
    Console.WriteLine("Main wait t1 t2 end }");
    Console.WriteLine("Sample 4-4 Main }");
}

到此這篇關(guān)于C#并發(fā)集合Concurrent類(lèi)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#調(diào)用打印機(jī)實(shí)現(xiàn)打印

    C#調(diào)用打印機(jī)實(shí)現(xiàn)打印

    這篇文章介紹了C#調(diào)用打印機(jī)實(shí)現(xiàn)打印的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • c# 繼承快速入門(mén)

    c# 繼承快速入門(mén)

    這篇文章主要介紹了c# 繼承快速入門(mén)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • WPF實(shí)現(xiàn)上下滾動(dòng)字幕效果

    WPF實(shí)現(xiàn)上下滾動(dòng)字幕效果

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)上下滾動(dòng)字幕效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Winform界面中實(shí)現(xiàn)菜單列表的動(dòng)態(tài)個(gè)性化配置管理方法

    Winform界面中實(shí)現(xiàn)菜單列表的動(dòng)態(tài)個(gè)性化配置管理方法

    下面小編就為大家分享一篇Winform界面中實(shí)現(xiàn)菜單列表的動(dòng)態(tài)個(gè)性化配置管理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Unity 通過(guò)LineRenderer繪制兩點(diǎn)之間的直線(xiàn)操作

    Unity 通過(guò)LineRenderer繪制兩點(diǎn)之間的直線(xiàn)操作

    這篇文章主要介紹了Unity 通過(guò)LineRenderer繪制兩點(diǎn)之間的直線(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法

    C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了C#使用晚綁定來(lái)實(shí)現(xiàn)壓縮Access數(shù)據(jù)庫(kù)的方法,項(xiàng)目開(kāi)發(fā)中有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)在PDF文檔中應(yīng)用多種不同字體

    C#實(shí)現(xiàn)在PDF文檔中應(yīng)用多種不同字體

    在PDF文檔中,可繪制不同字體樣式、不同語(yǔ)言的文字,可通過(guò)使用Standard字體、TrueType字體、CJK字體或者自定義(私有)等字體類(lèi)型。本文將具體介紹實(shí)現(xiàn)的方法,需要的可以參考一下
    2022-01-01
  • timespan使用方法詳解

    timespan使用方法詳解

    TimeSpan是用來(lái)表示一個(gè)時(shí)間段的實(shí)例,兩個(gè)時(shí)間的差可以構(gòu)成一個(gè)TimeSpan實(shí)例,現(xiàn)在就來(lái)介紹一下使用方法
    2014-04-04
  • C#?字典Dictionary的具體用法

    C#?字典Dictionary的具體用法

    本文主要介紹了C#?字典Dictionary的具體用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C#利用OLEDB實(shí)現(xiàn)將DataTable寫(xiě)入Excel文件中

    C#利用OLEDB實(shí)現(xiàn)將DataTable寫(xiě)入Excel文件中

    這篇文章主要為大家詳細(xì)介紹了C#如何利用OLEDB實(shí)現(xiàn)將DataTable寫(xiě)入Excel文件中,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02

最新評(píng)論

连江县| 绥中县| 民和| 武陟县| 怀集县| 潞城市| 蓬溪县| 清新县| 禹州市| 南充市| 贵定县| 淮安市| 明溪县| 南平市| 甘肃省| 滕州市| 凤台县| 南丹县| 呼玛县| 苍南县| 濮阳市| 阿坝| 阿拉善盟| 河西区| 峨眉山市| 黄山市| 布尔津县| 大竹县| 山西省| 宜城市| 马鞍山市| 湘潭县| 磐石市| 紫云| 呈贡县| 呼图壁县| 隆昌县| 临汾市| 高台县| 邳州市| 益阳市|