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

首頁 > 編程 > C# > 正文

C#線程同步的三類情景分析

2020-01-24 02:19:34
字體:
來源:轉載
供稿:網友

本文實例講述了C#線程同步的三類情景,分享給大家供大家參考。具體分析如下:

C# 已經提供了我們幾種非常好用的類庫如 BackgroundWorker、Thread、Task等,借助它們,我們就能夠分分鐘編寫出一個多線程的應用程序。

比如這樣一個需求:有一個 Winform 窗體,點擊按鈕后,會將窗體中的數據導出到一個 output.pdf 文件中。原先的代碼沒有采用多線程技術,所以當點擊按鈕后,整個窗體就變成無響應了。為了解決這個問題,可以使用 Task.Run(()=>{...導出文件的代碼});

上面的代碼看似簡單,卻隱藏著種種危機。如果在導出的期間,窗體的數據被修改了,那會怎么樣?如果多個窗體同時導出到同一個文件,又會怎么樣?

在看完本系列后,你就會清楚了。

有點了解的朋友都知道線程同步有多種手段,什么 mutex、moniter、seamphore、event 等等,我把它們歸為三類,對應三種需要線程同步的情景。

情景一:此茅坑有主了

當一個資源同時被多個線程訪問時,有可能會造成資源沖突(尤其是在存在多個寫線程的時候)的情景。遇到這種情況,在 C# 中,我們可以使用 Interlocked、lock、Moniter、SpinLock、ReadWriteLockSlim、Mutex 來處理問題。

什么情況下會被認為是情景一?

  當你設計的類中出現靜態變量、IO操作時,就會遇到情景一。因為這些資源是由多個對象共享的,不同的線程很同時去訪問這些資源時,就可能會出現爭用。

  當一個類被設計成單例,且包含實例變量時,也會遇到情景一。因為實例變量屬于這個單例,當多個線程操縱此單例時,該變量可能會被爭用。

  當一個類中的方法調用線程操作某個實例變量時,也會遇到情景一。

情景二:數量有限,先到先得

情景一強調的是一對多的情形,而在情景二中,資源的數量并不唯一。相比于情景一,情景二側重的是數量上的限制。而用于實現這一需求的類有:Semaphore、SemaphoreSlim。

什么情況下會被認為是情景二?

  當所操作的公共資源存在并發數限制的時候(如數據庫連接、IIS連接數限制等),就被認為是情景二。

情景三:我讓你動,你才能動!

情景三關注的是線程執行過程中的先后順序,而用于保證這種先后順序的方式就是通過線程通信的方式:ManualResetEventSlim、ManualResetEvent、AutoResetEvent。

什么情況下會被認為是情景三?

當兩個線程所處理的事情有先后的依賴時,比如線程二的執行過程依賴線程一的執行結果,那就認為是情景三。

不限使用情景

上面的各種方案并不是絕對只限于某一場景,比如 AutoResetEvent 即可以用于情景三,也可以用于情景一。但是,殺雞焉用牛刀,雖然使用 AutoResetEvent 能夠實現情景一的需求,但是用不了 AutoResetEvent 的線程通信能力,同時又會有一些額外的限制(每個線程必須保證 wait 和 set 的成對使用,否則一個線程在鎖定資源后就可能被另一個線程解鎖)。


復制代碼 代碼如下:
    lock (m)
    {
        //....
    }
    
    //等價于如下方式
    autoResetEvent.WaitOne();
    //....
    autoResetEvent.Set();


  也有朋友說,可以用情景一中的 lock 方案來實現情景三的需求。


    AutoResetEvent autoReset = new AutoResetEvent(false);
    private void button1_Click(object sender, EventArgs e)
    {     
        Task.Run(() =>
        {
            autoReset.WaitOne();
            Console.WriteLine("步驟二");
        });
 
        Thread.Sleep(1000);//故意延遲從而保證第二個線程是在第一個線程之后才執行
        Task.Run(() =>
        {
            Console.WriteLine("步驟一");
            autoReset.Set();
        });
    }

  上面這個例子最終輸出的結果可想而知。此實例說明,不管線程實際的執行順序如何,AutoResetEvent 都能很容易的保證兩個線程的執行順序。

如果用 lock 呢?

復制代碼 代碼如下:
    private void button1_Click(object sender, EventArgs e)
    {
        Task.Run(() =>
        {
            lock (s)
            {
                Console.WriteLine("步驟一");
            }
        });
 
        Thread.Sleep(1000);//必須人為確保步驟二的線程要在步驟一的線程之后執行
        Task.Run(() =>
        {
            lock (s)
            {
                Console.WriteLine("步驟二");
            }
        });
    }

雖然能實現,但是需要花費額外的代碼去人為保證兩個線程的執行順序。

如何在這么多方案中確定最終所使用的,需要你能對項目的各種情景進行分析,根據實際情景選擇對應的方案,而不至于大材小用。

總 結

通過本系列文章的介紹,相信能讓大家能對多線程中可能碰到的情景有一個概念,不至于在面臨多線程的時候手忙腳亂。

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av中文字幕在线| 永久免费看mv网站入口亚洲| 欧美大肥婆大肥bbbbb| 成人黄色免费片| 在线视频免费一区二区| 国产高清视频一区三区| 欧美一级在线亚洲天堂| 蜜臀久久99精品久久久久久宅男| 国产成人精品一区二区三区| 久久久免费高清电视剧观看| 亚洲第一中文字幕在线观看| 福利一区视频在线观看| 另类色图亚洲色图| 夜夜嗨av一区二区三区免费区| 国产精品久久久久久久久免费| 欧美精品在线观看91| 成人免费看吃奶视频网站| 欧美日韩国产精品一区二区不卡中文| 高清欧美性猛交xxxx黑人猛交| 日韩成人中文字幕| 91精品国产91久久久久福利| 久久亚洲国产精品成人av秋霞| 欧美一级bbbbb性bbbb喷潮片| 午夜剧场成人观在线视频免费观看| 久久偷看各类女兵18女厕嘘嘘| 在线国产精品视频| 自拍视频国产精品| 亚洲欧美精品一区| 欧美最猛性xxxxx免费| 亚洲视频国产视频| 91美女福利视频高清| 国产精品久久久久久久久久久新郎| 性欧美长视频免费观看不卡| 国内免费久久久久久久久久久| 久久精品国产欧美激情| 欧美在线日韩在线| 亚洲欧美中文在线视频| 国产一区二区三区四区福利| 精品福利在线视频| 亚洲国产精品99久久| 亚洲国产精彩中文乱码av| 国产精品对白刺激| 欧美久久精品一级黑人c片| 欧美激情视频在线观看| 国产精品一区二区av影院萌芽| 国产成人高潮免费观看精品| 日韩女优人人人人射在线视频| 欧美日韩亚洲一区二区| 黑人与娇小精品av专区| 狠狠躁天天躁日日躁欧美| 日本高清久久天堂| 久久影视电视剧免费网站| 黄色成人在线免费| 欧美性猛xxx| 日韩精品久久久久久久玫瑰园| 国产美女主播一区| 国产精品国内视频| 热久久这里只有| 欧美在线免费看| 国产精品美女在线观看| 国产精品久久久久久婷婷天堂| 欧美日本高清一区| 亚洲第一精品电影| 色婷婷av一区二区三区在线观看| 日韩成人中文电影| 日韩精品在线观看视频| 性金发美女69hd大尺寸| 国产精品亚洲综合天堂夜夜| 一本大道久久加勒比香蕉| 欧美一级电影免费在线观看| 国产啪精品视频| 91精品综合久久久久久五月天| 中文字幕日韩综合av| 亚洲午夜av电影| 精品视频偷偷看在线观看| 欧美亚洲另类在线| 日韩国产一区三区| 国产精品一区二区三区在线播放| 久久97久久97精品免视看| 日韩国产在线播放| 久久亚洲欧美日韩精品专区| 欧美自拍视频在线| 欧美做爰性生交视频| 亚洲美女av黄| 日本sm极度另类视频| 久久久久亚洲精品成人网小说| 亚洲一区美女视频在线观看免费| 性色av香蕉一区二区| 亚洲视频视频在线| 日韩免费电影在线观看| 51久久精品夜色国产麻豆| 国产亚洲一级高清| 国内免费久久久久久久久久久| 亚洲精品成人av| 日本不卡免费高清视频| 亚洲欧美日韩国产精品| 欧美亚洲一级片| 综合国产在线视频| 日韩有码在线播放| 欧美性猛交xxxx乱大交极品| 18性欧美xxxⅹ性满足| 欧美性猛交xxxx久久久| 91久久精品美女高潮| 日韩欧美国产骚| 亚洲tv在线观看| 欧美影院久久久| 欧美多人爱爱视频网站| 一本色道久久综合狠狠躁篇怎么玩| 91系列在线播放| 午夜精品福利视频| 91福利视频网| 久久99精品久久久久久青青91| 中文字幕亚洲专区| 国产美女主播一区| 91免费在线视频网站| 久久综合色影院| 国产不卡精品视男人的天堂| 国外日韩电影在线观看| 欧美中文字幕视频| 欧美重口另类videos人妖| 久久夜色精品亚洲噜噜国产mv| 国产这里只有精品| 国产精品日韩电影| 伊人久久久久久久久久| 精品成人在线视频| 日韩福利视频在线观看| 国外成人在线直播| 欧美日韩精品在线视频| 一本色道久久88亚洲综合88| 欧美日韩中文字幕综合视频| 色妞在线综合亚洲欧美| 欧美成人午夜免费视在线看片| 亚洲成年网站在线观看| 亚洲美女精品成人在线视频| 按摩亚洲人久久| 国内成人精品一区| 日本国产一区二区三区| 九九精品视频在线观看| 久久五月天综合| 亚洲成人动漫在线播放| 久久免费视频在线观看| 久久精品国产综合| 91精品国产91久久久久久吃药| 国产亚洲精品va在线观看| 国产97色在线| 中文欧美日本在线资源| 国产成人精品久久二区二区91| 92看片淫黄大片看国产片| 久久久国产一区| 日韩精品视频在线观看网址| 欧美视频二区36p| 欧美wwwwww| 国产一区二区在线免费视频| 国产剧情久久久久久| 亚洲毛茸茸少妇高潮呻吟| 久久久久久久久久婷婷| 久久综合网hezyo| www.xxxx欧美| 日产精品久久久一区二区福利| 97香蕉超级碰碰久久免费软件| 亚洲免费视频一区二区| 色av中文字幕一区| 亚洲精品视频在线播放| 精品人伦一区二区三区蜜桃网站|