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

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

 更新時間:2014年10月27日 08:59:28   投稿:shichen2014  
這篇文章主要介紹了C#線程同步的三類情景分析,較為詳細生動的講述了C#線程同步的三類情況,讓大家對C#多線程程序設計有一個深入的了解,需要的朋友可以參考下

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

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

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

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

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

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

情景一:此茅坑有主了

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

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

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

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

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

情景二:數(shù)量有限,先到先得

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

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

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

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

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

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

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

不限使用情景

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


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


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


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

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

如果用 lock 呢?

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

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

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

總 結

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

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

相關文章

  • C#時間戳基本用法實例分析

    C#時間戳基本用法實例分析

    這篇文章主要介紹了C#時間戳基本用法,較為詳細的講述了時間戳的概念、生成方法與轉換技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • mvc開啟gzip壓縮示例分享

    mvc開啟gzip壓縮示例分享

    這篇文章主要介紹了mvc開啟gzip壓縮示例,需要的朋友可以參考下
    2014-03-03
  • C#創(chuàng)建壓縮文件的實現(xiàn)代碼

    C#創(chuàng)建壓縮文件的實現(xiàn)代碼

    本篇文章主要介紹了C# 創(chuàng)建壓縮文件的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • c# Thread類的用法詳解

    c# Thread類的用法詳解

    這篇文章主要介紹了c# Thread類的用法的相關資料,幫助大家更好的理解和學習c#的相關知識,感興趣的朋友可以了解下
    2020-11-11
  • C#泛型詳解

    C#泛型詳解

    本文詳細講解了C#中的泛型,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 如何實現(xiàn)定時推送的具體方案

    如何實現(xiàn)定時推送的具體方案

    在工作當中遇到了一個需要定時向客戶端推送新聞、文章等內(nèi)容。小項目又用不了大框架,這個時候在網(wǎng)上搜了很久沒有找到合適的解決方案,直到看到了一位大佬寫的文章提供了一個非常不錯的思路本篇文章也是受到他的啟發(fā)實現(xiàn)了之后這里分享給大家
    2021-04-04
  • Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用

    Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用

    這篇文章主要為大家介紹了Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • C#6.0新語法示例詳解

    C#6.0新語法示例詳解

    這篇文章主要給大家介紹了關于C#6.0新語法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C#使用Aspose.Cells控件讀取Excel

    C#使用Aspose.Cells控件讀取Excel

    本文介紹Aspose.Cells基礎的用法,供大家參考。
    2016-03-03
  • C#解析json文件的實現(xiàn)代碼

    C#解析json文件的實現(xiàn)代碼

    最近需要用c#解析json文件,以前沒用過這個,百度了一下找到了這篇文章感覺不錯,特分享下
    2013-06-06

最新評論

丘北县| 西乌| 东光县| 灵丘县| 丘北县| 娱乐| 扎赉特旗| 通城县| 滦平县| 阿鲁科尔沁旗| 武定县| 米易县| 华亭县| 克什克腾旗| 阜宁县| 桂林市| 中阳县| 西贡区| 阳曲县| 红原县| 上虞市| 隆化县| 屏东县| 航空| 镇巴县| 兴义市| 湖州市| 鲁甸县| 洪洞县| 永兴县| 泰安市| 建德市| 新田县| 都兰县| 海丰县| 呼玛县| 吴桥县| 连江县| 南宁市| 同心县| 高碑店市|