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

C#多線程之Parallel類的用法

 更新時間:2022年04月13日 09:33:09   作者:Ruby_Lu  
這篇文章介紹了C#多線程之Parallel類的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Parallel類是對線程的一個抽象。該類位于System.Threading.Tasks名稱空間中,提供了數(shù)據(jù)和任務(wù)并行性。

Paraller類定義了數(shù)據(jù)并行地For和ForEach的靜態(tài)方法,以及任務(wù)并行的Invoke的靜態(tài)方法。Parallel.For()和Parallel.ForEach()方法在每次迭代中調(diào)用相同的代碼,Paraller.Invoke()允許調(diào)用不同的方法。

1.Parallel.For

Parallel.For()方法類似C#語法的for循環(huán)語句,多次執(zhí)行一個任務(wù)。但該方法并行運行迭代,迭代的順序沒有定義。

Parallel.For()方法中,前兩個參數(shù)定義了循環(huán)的開頭和結(jié)束,第三個參數(shù)是一個Action委托。Parallel.For方法返回類型是ParallelLoopResult結(jié)構(gòu),它提供了循環(huán)是否結(jié)束的信息。

Parallel.For有多個重載版本和多個泛型重載版本。

示例:

static void ForTest()
        {
            ParallelLoopResult plr =
                Parallel.For(0,10,i => {
                    Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(5000);
                });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");

        }

輸出:

任務(wù)不一定映射到一個線程上。線程也可以被不同的任務(wù)重用。

上面的例子,使用了.NET 4.5中新增的Thread.Sleep方法,而不是Task.Delay方法。Task.Delay是一個異步(http://www.cnblogs.com/afei-24/p/6757361.html)方法,用于釋放線程供其它任務(wù)使用。

示例:

static void ForTestDelay()
        {
            ParallelLoopResult plr =
                Parallel.For(0, 10,async i => {
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    await Task.Delay(1000);
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");

            Console.ReadKey();

        }

輸出:

上面代碼使用了await關(guān)鍵字進行延遲,輸出結(jié)果顯示延遲前后的代碼運行在不同的線程中。而且延遲后的任務(wù)不再存在,只留下線程,這里還重用了前面的線程。另一個重要的方面是,Parallel類的For方法并沒有等待延遲,而是直接完成。parallel類只等待它創(chuàng)建的任務(wù),而不等待其它后臺活動。所以上面代碼使用了Console.ReadKey();使主線程一直運行,不然很可能看不到后面的輸出。

2.提前停止Parallel.For

For()方法的一個重載版本接受第三個Action<int,ParallelLoopState>委托類型的參數(shù)。使用這個方法可以調(diào)用ParallelLoopState的Break()或Stop()方法,以停止循環(huán)。

注意,前面說到,迭代的順序是沒有定義的。

示例:

static void ForStop()
        {
            ParallelLoopResult plr =
                Parallel.For(0,10,(int i,ParallelLoopState pls)=> {
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    if (i > 5)
                        pls.Break();
                });

            Console.WriteLine("is completed:{0}",plr.IsCompleted);
            Console.WriteLine("最低停止索引:{0}",plr.LowestBreakIteration);
        }

輸出:

迭代值在大于5時中斷,但其它已開始的任務(wù)同時執(zhí)行。

3.對Parallel.For中的每個線程初始化

Parallel.For方法使用多個線程來執(zhí)行循環(huán),如果需要對每個線程進行初始化,就可以使用Parallel.For<TLocal>()方法。除了from和to對應的值之外,Parallel.For方法的泛型版本還接受3個委托參數(shù):

第一個委托參數(shù)的類型是Func<TLocal>,這個方法僅對用于執(zhí)行迭代的每個線程調(diào)用每一次。

第二個委托參數(shù)為循環(huán)體定義了委托。該參數(shù)類型是Func<int, ParallelLoopState, TLocal, TLocal>。其中第一個參數(shù)是循環(huán)迭代,第二個參數(shù)ParallelLoopState允許停止循環(huán),第三個參數(shù)接受從上面參數(shù)委托Func<TLocal>返回的值,該委托還需返回一個TLocal類型的值。該方法對每次迭代調(diào)用。

第三個委托參數(shù)指定一個委托Action<TLocal>,接受第二個委托參數(shù)的返回值。這個方法僅對用于執(zhí)行迭代的每個線程調(diào)用每一次。

示例:

static void ForInit()
            {
                ParallelLoopResult plr =
                    Parallel.For(0,10,()=> {
                        Console.WriteLine("init thread:{0},task:{1}",Thread.CurrentThread.ManagedThreadId,Task.CurrentId);
                        return Thread.CurrentThread.ManagedThreadId.ToString();
                    },
                    (i, pls,strInit)=> {
                        Console.WriteLine("body:{0},strInit:{1},thraed:{2},task:{3}",i,strInit,Thread.CurrentThread.ManagedThreadId,Task.CurrentId);
                        return i.ToString();
                    },
                    (strI)=> {
                        Console.WriteLine("finally {0}",strI);
                    });
            }

輸出:

4.Parallel.ForEach

Parallel.ForEach方法遍歷實現(xiàn)了IEnumerable的集合,類似于foreach,但以異步方式遍歷。沒有確定遍歷順序。

示例:

static void ForeachTest()
    {
        string[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };
        ParallelLoopResult plr =  Parallel.ForEach<string>(data, s =>
        {
            Console.WriteLine(s);
        });
 
        if (plr.IsCompleted)
            Console.WriteLine("completed!");
    }

如果需要中斷,可以使用ForEach的重載版本和參數(shù)ParallelLoopState。

訪問索引器:

ParallelLoopResult plr1 = Parallel.ForEach<string>(data, (s,pls,l) =>
            {
                Console.WriteLine("data:{0},index:{1}",s,l);
            });

5.Parallel.Invoke

如果多個任務(wù)并行運行,可以使用Parallel.Invoke方法。該方法允許傳遞一個Action委托數(shù)組。

static void ParallerInvoke()
        {
            Action[] funs = { Fun1,Fun2};

            Parallel.Invoke(funs);
        }

        static void Fun1()
        {
            Console.WriteLine("f1");
            Console.WriteLine("task:{0},thread:{1}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        }
        static void Fun2()
        {
            Console.WriteLine("f2");
            Console.WriteLine("task:{0},thread:{1}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        }

到此這篇關(guān)于C#多線程之Parallel類的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#多線程系列之原子操作

    C#多線程系列之原子操作

    本文詳細講解了C#多線程的原子操作,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C#.NET采用HTML模板發(fā)送電子郵件完整實例

    C#.NET采用HTML模板發(fā)送電子郵件完整實例

    這篇文章主要介紹了C#.NET采用HTML模板發(fā)送電子郵件的方法,主要包括了HTML模板、替換函數(shù)與郵件函數(shù)三部分,是非常實用的功能,需要的朋友可以參考下
    2014-09-09
  • C#線程同步的幾種方法總結(jié)

    C#線程同步的幾種方法總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于C#線程同步的幾種方法總結(jié),需要的朋友們可以學習下。
    2020-02-02
  • C#處理MySql多個返回集的方法

    C#處理MySql多個返回集的方法

    這篇文章主要介紹了C#處理MySql多個返回集的方法,實現(xiàn)了對處理MySql多個返回集進行封裝,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • C#求點集的最小包圍矩形

    C#求點集的最小包圍矩形

    這篇文章主要為大家詳細介紹了C#求點集的最小包圍矩形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#使用GDI畫圓的方法

    C#使用GDI畫圓的方法

    這篇文章主要介紹了C#使用GDI畫圓的方法,涉及C#使用GDI繪圖的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#實現(xiàn)客戶端彈出消息框封裝類實例

    C#實現(xiàn)客戶端彈出消息框封裝類實例

    這篇文章主要介紹了C#實現(xiàn)客戶端彈出消息框封裝類,實例分析了C#彈出窗口的實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C#中實現(xiàn)線程同步lock關(guān)鍵字的用法詳解

    C#中實現(xiàn)線程同步lock關(guān)鍵字的用法詳解

    實現(xiàn)線程同步的第一種方式是我們經(jīng)常使用的lock關(guān)鍵字,它將包圍的語句塊標記為臨界區(qū),這樣一次只有一個線程進入臨界區(qū)并執(zhí)行代碼,接下來通過本文給大家介紹C#中實現(xiàn)線程同步lock關(guān)鍵字的用法詳解,一起看看吧
    2016-07-07
  • c# 網(wǎng)絡(luò)編程之tcp

    c# 網(wǎng)絡(luò)編程之tcp

    這篇文章主要介紹了c# 網(wǎng)絡(luò)編程之tcp的的相關(guān)資料,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-02-02
  • 理解C#中的Lambda表達式

    理解C#中的Lambda表達式

    這篇文章主要介紹了理解C#中的Lambda表達式,本文用實例代碼來講解Lambda表達式,用不同的角度總結(jié)對它的認識,需要的朋友可以參考下
    2015-04-04

最新評論

万荣县| 阜康市| 屏南县| 抚远县| 班戈县| 奇台县| 常德市| 靖边县| 贞丰县| 汾西县| 乌兰察布市| 祥云县| 临沂市| 张家口市| 牙克石市| 定结县| 安溪县| 丽江市| 无为县| 浦县| 汉沽区| 景泰县| 宕昌县| 仁怀市| 仁怀市| 浑源县| 惠安县| 绥宁县| 兴山县| 石首市| 白城市| 肇州县| 龙井市| 西乌| 文成县| 浏阳市| 阳泉市| 北流市| 平顺县| 镇康县| 大港区|