亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#多線程,論多核時代愛恨情仇

2019-11-14 13:44:48
字體:
來源:轉載
供稿:網友

為什么要學習多線程?

  • 2010年1月21日是10年某市公務員考試的報名截止日。因從下午2點開始,用于報名的北京市人事考試網癱瘓,原定于昨天下午5點截止的報名時間延遲至今天上午11點。
  • 2011年3月11日下午5時(北京時間12日早9點),蘋果發布新一代的平板電腦產品ipad 2,配備了A5.1Ghz雙核處理器,這寓意著平板電腦和筆記本一同進入"多核時代"。
  • 同年6月18日,國內著名B2C---京東在周年慶典之際舉行了"隆重"的大規模的促銷活動,搶購隨之而來,訂單擠爆京東 限時達臨時取消。 昨天有消費者反映,由于點擊量過大,18日早上京東商城網站一度癱瘓。一位消費者說:“18日凌晨1點開始就登不上京東商城。”劉強東也表示:由于流量多次超過4個G,服務器運行緩慢。 昨天,京東商城官網發布公告稱,“‘618’活動異?;鸨矣脩粝聠嗡俣瓤涨?,致使部分用戶已購訂單顯示出現延遲,用戶在一段時間內無法在‘我的京東’中查詢到自己的訂單。目前已購訂單顯示延遲的問題已得到有效解決,對此給您帶來的不便,我們深表歉意。”
  • 2015年05月05日登錄風信子網上商城發現,首頁除了廣告和相關消息外,只有“注冊賬號獲取更多優惠”這唯一一個按鈕,沒有商品展示,沒有產品搜索,不能網上下單,甚至連進入商城的按鈕也沒有。風信子南沙跨境商品直購體驗中心相關負責人表示,這主要是因為預約的人數太多,截至五一,預約人數已超過十萬,太多人頻繁登陸,導致網店服務器癱瘓,目前技術人員還在努力維修中。該負責人介紹,體驗中心的網站目前正在調試,“網站目前的作用主要是給市民預約和提前注冊,通過網絡注冊的市民不用在現場驗證身份證等信息,可以提高購買效率。”

下面通過一些實例來認識一下多線程和讓大家知道為什么要學習多線程。

C# 多線程

v寫在前面

老板只有兩種,好的和壞的。好的老板只跟你談錢,壞的老板只跟你談理想。

v模擬場景

假設后臺有個monitor時事的在監測訂單,且可以發現訂單然后處理訂單,每次(1次/S)可以處理1千個訂單,需要向倉庫系統發出指令,讓他們負責配送發貨。那么我們來寫一個EmulationSystem(模擬系統)

C# 多線程

JobHelper因為我們只是為了模擬一個環境,所以它是這樣的。

//------------------------------------------------------------------------------// <copyright file="JobHelper.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥">//     Copyright (C) 2015-2016 All Rights Reserved//     原博文地址: http://www.49028c.com/toutou/// </copyright> //------------------------------------------------------------------------------namespace CNBlogs.Common.Shared{    using System.Threading;    /// <summary>    /// Job helper    /// </summary>    public class JobHelper    {        /// <summary>    /// Get job total count        /// </summary>    /// <returns></returns>    public int GetJobCount()        {            // 我們的側重點是多線程,所以我們就模擬每次有1千個訂單,而模擬,所以我們不關心其他的。只要訂單數量。    return 1000;        }        /// <summary>    /// Submit job        /// </summary>    /// <param name="jobId">For job id</param>    /// <returns>Submit job status</returns>    public bool SubmitJob(int jobId)        {            // 假設針對每個訂單向后臺發送任務需要1秒,而且每個訂單都能成功發送            Thread.Sleep(1000);            return true;        }    }}

背景我們也交待完了,現在需要來得到這些訂單信息以后,向倉庫submit這些訂單。

v實戰演習

根據這種背景,我們可以有很多處理的辦法。

  • 傳統辦法:

    (開啟無腦模式:未使用多線程)

    代碼正文:

    //------------------------------------------------------------------------------// <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥">//     Copyright (C) 2015-2016 All Rights Reserved//     原博文地址: http://www.49028c.com/toutou/// </copyright> //------------------------------------------------------------------------------namespace CNBlogs.EmulationSystem{    using System;    using System.Threading;    using CNBlogs.Common.Shared;    class Runner    {        /// <summary>                /// Job helper        /// </summary>                PRivate static JobHelper jobHelper = new JobHelper();        /// <summary>                /// Runner lock        /// </summary>                private static Mutex mutex;        static void Main(string[] args)        {            // 記錄開始處理的時間            DateTime paddingTime = DateTime.Now.ToLocalTime();            int orderCount = jobHelper.GetJobCount();            // 用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。            // 當前進程只能啟動一次            mutex = new Mutex(false, "CNBlogs.EmulationSystem");            if (!mutex.WaitOne(0, false))            {                Console.Out.WriteLine("Monitor already running...");                return;            }            for (int i = 0; i < orderCount; i++)            {                // 假設i就是job id                jobHelper.SubmitJob(i);            }            // 記錄處理完成的時間            DateTime completeTime = DateTime.Now.ToLocalTime();            var minutes = (completeTime - paddingTime).TotalSeconds;            Console.WriteLine(string.Format("處理{0}個訂單,花費時間{1}秒", orderCount, minutes));        }    }}

    代碼效果:

    PS:現在的這些個電商,動不動來個什么周年慶店慶什么雙11雙12的一頓突突,搞得咱這些老百姓就全部蜂擁而上,顯然如果用傳統的方法雖然不會出錯,但是老板肯定會找你喝茶。在多核時代用這種方法也只能鐵不成鋼了。所以這個方法是絕對不可取的。

  • Task方法:

    如果有對Task不是很熟悉的園友可以在這里解開心謎。

    代碼正文:

    //------------------------------------------------------------------------------// <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥">//     Copyright (C) 2015-2016 All Rights Reserved//     原博文地址: http://www.49028c.com/toutou/// </copyright> //------------------------------------------------------------------------------namespace CNBlogs.EmulationSystem{    using System;    using System.Collections.Generic;    using System.Threading;    using System.Threading.Tasks;    using CNBlogs.Common.Shared;    class Runner    {        /// <summary>                /// Job helper        /// </summary>                private static JobHelper jobHelper = new JobHelper();        /// <summary>                /// Runner lock        /// </summary>                private static Mutex mutex;        static void Main(string[] args)        {            // 記錄開始處理的時間            DateTime paddingTime = DateTime.Now.ToLocalTime();            int orderCount = jobHelper.GetJobCount();            // 用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。            // 當前進程只能啟動一次            mutex = new Mutex(false, "CNBlogs.EmulationSystem");            if (!mutex.WaitOne(0, false))            {                Console.Out.WriteLine("Monitor already running...");                return;            }            var taskList = new List<Task>();            for (int i = 0; i < orderCount; i++)            {
    int temp=i; taskList.Add(Task.Factory.StartNew(()
    => { // 假設i就是job id jobHelper.SubmitJob(temp); })); } // 等待所有task執行完畢 Task.WaitAll(taskList.ToArray()); // 記錄處理完成的時間 DateTime completeTime = DateTime.Now.ToLocalTime(); var minutes = (completeTime - paddingTime).TotalSeconds; Console.WriteLine(string.Format("Complete: {0},cost {1} s", orderCount, minutes)); } }}

    代碼效果:

    C# 多線程

    相信分別從有TASK和沒有TASK的這兩次demo中,可以清楚的發現多線程處理這些頻繁交互能力的魅力。你會愛上這個方法。確實提高的效率。但是問題也隨之而來,一個進程多線程的總數和大小是有要求的(這個取決于服務器的配置),不是任由我們肆意的開采的。如果訂單太多,我們不控制task那是會拉仇恨的。task需要控制。

    C# 多線程

  • Semaphore:

    如果有對Semaphore不是很熟悉的園友可以在這里解開心謎。

    代碼正文:

    //------------------------------------------------------------------------------// <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥">//     Copyright (C) 2015-2016 All Rights Reserved//     原博文地址: http://www.49028c.com/toutou/// </copyright> //------------------------------------------------------------------------------namespace CNBlogs.EmulationSystem{    using System;    using System.Collections.Generic;    using System.Threading;    using System.Threading.Tasks;    using CNBlogs.Common.Shared;    class Runner    {        /// <summary>                /// Job helper        /// </summary>                private static JobHelper jobHelper = new JobHelper();        /// <summary>                /// The locker used to lock the semaphore and thread.        /// </summary>                private static object lockerObj = new object();        /// <summary>                /// The semaphore limit the thread number of get latest test info        /// </summary>                private static Semaphore semaphoreLimit;        /// <summary>                /// Runner lock        /// </summary>                private static Mutex mutex;        static void Main(string[] args)        {            // 記錄開始處理的時間            DateTime paddingTime = DateTime.Now.ToLocalTime();            int orderCount = jobHelper.GetJobCount();            // 用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。            // 當前進程只能啟動一次            mutex = new Mutex(false, "CNBlogs.EmulationSystem");            if (!mutex.WaitOne(0, false))            {                Console.Out.WriteLine("Monitor already running...");                return;            }            // 假設我們的服務器一個進程只能接受的大小=當前線程大小*500 ps:500是設置信號量的最大值                int maxProcNumber = 500;            using (semaphoreLimit = new Semaphore(0, maxProcNumber))            {                // 以指定的次數退出信號量并返回前一個計數。                semaphoreLimit.Release(maxProcNumber);                var taskList = new List<Task>();                for (int i = 0; i < orderCount; i++)                {
    int temp=i;
    // 如果SubmitJob有IO或者其他容易因為沖突而引起異常的話,這里需要加上lock //lock (lockerObj) //{ semaphoreLimit.WaitOne(); taskList.Add(Task.Factory.StartNew(() => { // 假設i就是job id jobHelper.SubmitJob(temp); // 退出信號量并返回前一個計數。 semaphoreLimit.Release(); })); //} } // 等待所有task執行完畢 Task.WaitAll(taskList.ToArray()); } // 記錄處理完成的時間 DateTime completeTime = DateTime.Now.ToLocalTime(); var minutes = (completeTime - paddingTime).TotalSeconds; Console.WriteLine(string.Format("Complete: {0},cost {1} s", orderCount, minutes)); } }}

    代碼效果:

v博客總結

多線程路還很長...

 


作  者:請叫我頭頭哥
出  處:http://www.49028c.com/toutou/
關于作者:專注于微軟平臺的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
正在播放国产一区| 久久福利视频导航| 国产一区二区三区免费视频| 国产亚洲人成a一在线v站| 国产精品欧美一区二区三区奶水| 综合网日日天干夜夜久久| 欧美肥婆姓交大片| 亚洲一区二区少妇| 中文字幕久热精品在线视频| 国产一区二区三区在线| 国产日本欧美一区二区三区在线| 国产精品ⅴa在线观看h| 国产精品h在线观看| 国产精品丝袜久久久久久不卡| 国产欧美日韩精品在线观看| 久久成人精品一区二区三区| 欧美电影在线观看网站| 91久久综合亚洲鲁鲁五月天| 色偷偷亚洲男人天堂| 欧美激情在线观看视频| 成人情趣片在线观看免费| 欧美黑人xxxⅹ高潮交| 国产精品美女免费| 一区三区二区视频| 久久久亚洲福利精品午夜| 精品视频在线播放| 亚洲最大成人免费视频| 亚洲香蕉在线观看| 欧美人交a欧美精品| 欧美乱妇40p| 91免费精品视频| 日韩免费视频在线观看| 在线激情影院一区| 亚洲在线www| 亚洲精品成人av| 精品福利一区二区| 国产精品美女av| 成人午夜在线影院| 国产精品久久久久久久久久久不卡| 成人久久18免费网站图片| 日韩精品福利网站| 粉嫩av一区二区三区免费野| 欧美色xxxx| 日韩理论片久久| 久久精品国产久精国产一老狼| 色午夜这里只有精品| 国产欧美日韩免费看aⅴ视频| 国产激情久久久久| 色综合色综合久久综合频道88| 伦伦影院午夜日韩欧美限制| 6080yy精品一区二区三区| 精品亚洲男同gayvideo网站| 亚洲韩国青草视频| 色综合久综合久久综合久鬼88| 超碰精品一区二区三区乱码| 欧美日韩国产中文精品字幕自在自线| 91久久精品日日躁夜夜躁国产| 亚洲人成77777在线观看网| 美女久久久久久久久久久| 亚洲免费人成在线视频观看| 亚洲视屏在线播放| 亚洲福利视频久久| 欧美一级高清免费播放| 国内精品久久久久久久久| 久久免费少妇高潮久久精品99| 久久久久成人精品| 欧美亚洲日本黄色| 欧美久久精品午夜青青大伊人| 国产中文日韩欧美| 91av在线国产| 不卡在线观看电视剧完整版| 日韩一二三在线视频播| 国产成+人+综合+亚洲欧洲| 国内精品久久久久久| 日韩免费在线看| 欧美激情图片区| 久久99久久99精品免观看粉嫩| 91亚洲精品久久久久久久久久久久| 亚洲精品国产精品国自产观看浪潮| 国产精品99导航| 91在线免费视频| 精品精品国产国产自在线| 另类视频在线观看| 国产拍精品一二三| 国产欧美日韩91| 欧美孕妇毛茸茸xxxx| 精品日本美女福利在线观看| 欧美中文字幕第一页| 国模极品一区二区三区| 国产美女精品视频| 久久精品视频在线| 亚洲一区国产精品| 色综合伊人色综合网站| 国产视频综合在线| 国产欧美在线观看| 日韩精品小视频| 国产精品吊钟奶在线| 一区二区欧美日韩视频| 久久久噜噜噜久久中文字免| 中文字幕亚洲欧美在线| 日本亚洲欧美三级| 亚洲午夜国产成人av电影男同| 青青草国产精品一区二区| 2019中文在线观看| 亚洲美女性生活视频| 日韩av高清不卡| 疯狂做受xxxx欧美肥白少妇| 亚洲国产精品久久| 91在线观看免费高清完整版在线观看| 欧美高清视频在线观看| 国产精品视频成人| 久久91超碰青草是什么| 夜夜嗨av一区二区三区四区| 青草青草久热精品视频在线观看| 欧美一级大胆视频| 欧美精品在线第一页| 日韩经典第一页| 中文字幕欧美日韩在线| 欧美高清电影在线看| 国产一区二区三区在线免费观看| 欧美裸体男粗大视频在线观看| 精品国产91久久久久久老师| 97在线视频免费看| 日本精品久久久| 久久久久久亚洲| 国产suv精品一区二区| 在线观看精品自拍私拍| 亚洲变态欧美另类捆绑| 成人久久一区二区三区| 在线国产精品视频| 久久国产精品视频| 国内外成人免费激情在线视频网站| 日本久久久久久久久| 日av在线播放中文不卡| 成人黄色生活片| 国产精品视频xxx| 国模吧一区二区三区| 欧美精品videosex极品1| 黄色精品一区二区| 欧美电影电视剧在线观看| 国产精品久久久久久久9999| 欧美一级高清免费播放| 国产精品电影网站| 国产成人一区二| 亚洲第一级黄色片| 亚洲黄页视频免费观看| 91香蕉国产在线观看| 精品亚洲va在线va天堂资源站| 中文字幕一精品亚洲无线一区| 色av中文字幕一区| 超碰日本道色综合久久综合| 91色在线观看| 欧美高清自拍一区| 亚洲男人天堂手机在线| 午夜精品理论片| 欧美日韩国产一区在线| 91av在线播放| 亚洲性线免费观看视频成熟| 免费91麻豆精品国产自产在线观看| 日韩最新在线视频| 亚洲第一区第一页| 欧美韩国理论所午夜片917电影| 精品视频久久久久久| 热久久美女精品天天吊色|