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

實(shí)例代碼講解c# 線程(下)

 更新時(shí)間:2020年06月24日 14:58:55   作者:HueiFeng  
這篇文章主要介紹了c# 線程的的相關(guān)資料,文中示例代碼非常細(xì)致,對(duì)大家的學(xué)習(xí)有很大幫助,感興趣的朋友可以了解下

前言

實(shí)例代碼講解c# 線程(上)

使用Mutex類

class Program
    {
     static void Main(string[] args)
    {
    const string MutexName ="CSharpThreadingCookbook";
    using (var m = new Mutex(false, MutexName))
    {
    if (!m.WaitOne(TimeSpan.FromSeconds(5), false))
    {
     Console.WriteLine("Second instance is running!");
    }
    else {
     Console.WriteLine("Runing!");
     Console.ReadLine();
     m.ReleaseMutex();
    }
   }
  }
 }

當(dāng)主程序啟動(dòng)時(shí),定義了一個(gè)指定名稱的互斥量,設(shè)置initialowner標(biāo)志為false。這意味著如果互斥量已經(jīng)被創(chuàng)建,則允許程序獲取該互斥量。如果沒有獲取到互斥量,程序則簡單的顯示running,的等待知道按下了任何鍵,然后釋放該互斥量并退出。 如果再運(yùn)行同樣一個(gè)程序,則會(huì)在5秒內(nèi)嘗試獲取互斥量。如果此時(shí)在第一個(gè)程序中按下了任何鍵,第二個(gè)程序則會(huì)開始執(zhí)行。然而,如果保持等待5秒鐘,第二個(gè)程序?qū)o法獲取到該互斥量。 該方式可用于在不同的程序中同步線程,可被推廣到大量的使用場景中。

使用SemaphoreSilm類

static SemaphoreSlim _semaphore = new SemaphoreSlim(4);

   static void AccessDatabase(string name, int seconds) {
   Console.WriteLine("{0} waits to access a database",name);
   _semaphore.Wait();
   Console.WriteLine("{0} was granted an access to a database",name);
   Thread.Sleep(TimeSpan.FromSeconds(seconds));
   Console.WriteLine("{0} is completed",name);
   _semaphore.Release();

  }
static void Main(string[] args)
   {
   for (int i = 1; i <= 6; i++) {
    string threadName ="Thread" + i;
    int secondsToWait = 2 + 2 * i;
    var t = new Thread(() => AccessDatabase(threadName, secondsToWait));
    t.Start();
   }
   Console.ReadKey();
  }

當(dāng)主程序啟動(dòng)時(shí),創(chuàng)建了SemaphoreSlim的一個(gè)實(shí)例,并在其構(gòu)造函數(shù)中指定允許的并發(fā)線程數(shù)量。然后啟動(dòng)了6個(gè)不同名稱和不同初始運(yùn)行時(shí)間的線程。每個(gè)線程都嘗試獲取數(shù)據(jù)庫的訪問,但是我們借助于信號(hào)系統(tǒng)限制了訪問數(shù)據(jù)庫的并發(fā)數(shù)為4個(gè)線程。當(dāng)有4個(gè)線程獲取數(shù)據(jù)庫的訪問后,其他兩個(gè)線程需要等待,直到之前線程中的某一個(gè)完成工作并調(diào)用_semaphore.Release方法來發(fā)出信號(hào)。

使用AutoResetEvent類

private staticAutoResetEvent _workerEvent=new AutoResetEvent(false);
   private staticAutoResetEvent _mainEvent =new AutoResetEvent(false);
   static void Process(int seconds)
   {
    Console.WriteLine("Starting a long running work... ");
    Thread.Sleep(TimeSpan.FromSeconds(seconds));
    Console.WriteLine("Work is done!");
    _workerEvent.Set();
    Console.WriteLine("Waiting for a main thread to complete its work");
    _mainEvent.WaitOne();
    Console.WriteLine("starting second operation... ");
    Thread.Sleep(TimeSpan.FromSeconds(seconds));
    Console.WriteLine("Work is done!");
    _workerEvent.Set();
  }
static void Main(string[] args)
   {
    var t = new Thread(() => Process(10));
    t.Start();
    Console.WriteLine("Waiting for a main thread to complete its work");
    _workerEvent.WaitOne();
    Console.WriteLine("First operation is completed!");
    Console.WriteLine("Performing an operation on a main thread");
    Thread.Sleep(TimeSpan.FromSeconds(5));
    _mainEvent.Set();
    Console.WriteLine("Now running the second operation on a second thread");
    _workerEvent.WaitOne();
    Console.WriteLine("Second operation is completed!");
  }

當(dāng)主程序啟動(dòng)時(shí),定義了兩個(gè)autoresetEvent實(shí)例。其中一個(gè)是從子線程向主線程發(fā)信號(hào),另一個(gè)實(shí)例是從主線程向子線程發(fā)信息號(hào) 。我們向AutoResetEvent構(gòu)造方法傳入false,定義了這兩個(gè)實(shí)例初始狀態(tài)為unsignaled。這意味著我們?nèi)魏尉€程調(diào)用這兩個(gè)對(duì)象中的任何一個(gè) waitone方法將會(huì)被堵塞,直到我們調(diào)用了set方法。如果初試事件為true,那么autoresetEvent實(shí)例的狀態(tài)為sigaled,如果線程調(diào)用waitone方法則會(huì)立即處理。 然后事件狀態(tài)自動(dòng)變?yōu)閡nsignaled,所以需要再對(duì)改實(shí)例調(diào)用一次set方法,以便讓其他的線程對(duì)該實(shí)例調(diào)用waitone方法從而繼續(xù)執(zhí)行。 然后我們創(chuàng)建了第二個(gè)線程,其會(huì)執(zhí)行第一個(gè)操作10秒鐘,然后等待從第二個(gè)線程發(fā)出的信號(hào)。該信號(hào)意味著第一個(gè)操作已經(jīng)完成。現(xiàn)在第二個(gè)線程在 等待主線程的信號(hào),我們對(duì)主線程做了一些1附加工作,并通過調(diào)用_mainEvent.Set方法發(fā)送了一個(gè)信號(hào)。然后等待從第二個(gè)線程發(fā)出的另一個(gè)信號(hào) AutoResetEvent類采用的是內(nèi)核時(shí)間模式,所以等待時(shí)間不能太長。使用2.6節(jié)中的ManualResetEventslim類更好,因?yàn)樗褂玫氖腔旌夏J健?/p>

以上就是實(shí)例代碼講解c# 線程(下)的詳細(xì)內(nèi)容,更多關(guān)于c# 線程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐

    TFTP不僅有斷點(diǎn)續(xù)傳,多用戶級(jí)別限制等功能,本文主要介紹了C#實(shí)現(xiàn)TFTP客戶端的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • 淺談C# winForm 窗體閃爍的問題

    淺談C# winForm 窗體閃爍的問題

    下面小編就為大家?guī)硪黄獪\談C# winForm 窗體閃爍的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C#實(shí)現(xiàn)銷售管理系統(tǒng)

    C#實(shí)現(xiàn)銷售管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)銷售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C#實(shí)現(xiàn)SMTP郵件附件發(fā)送功能詳解

    C#實(shí)現(xiàn)SMTP郵件附件發(fā)送功能詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)SMTP郵件附件發(fā)送的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 使用C#實(shí)現(xiàn)自己封裝的Modbus工具類庫

    使用C#實(shí)現(xiàn)自己封裝的Modbus工具類庫

    Modbus通訊協(xié)議在工控行業(yè)的應(yīng)用是很多的,并且也是上位機(jī)開發(fā)的基本技能之一,所以本文主要為大家介紹了如何使用C#封裝一個(gè)Modbus工具類庫,需要的可以參考下
    2024-02-02
  • C#中AS和IS關(guān)鍵字的用法

    C#中AS和IS關(guān)鍵字的用法

    這篇文章主要介紹了C#中AS和IS關(guān)鍵字的用法的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • c# 預(yù)處理識(shí)別硬幣的數(shù)據(jù)集

    c# 預(yù)處理識(shí)別硬幣的數(shù)據(jù)集

    這篇文章主要介紹了c# 預(yù)處理識(shí)別硬幣的數(shù)據(jù)集的方法,幫助大家更好的利用c#進(jìn)行深度學(xué)習(xí),感興趣的朋友可以了解下
    2020-12-12
  • c#解析jobject的數(shù)據(jù)結(jié)構(gòu)

    c#解析jobject的數(shù)據(jù)結(jié)構(gòu)

    這篇文章介紹了c#解析jobject數(shù)據(jù)結(jié)構(gòu)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C#實(shí)現(xiàn)銀行家算法

    C#實(shí)現(xiàn)銀行家算法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)銀行家算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • c# 防火墻添加/刪除 特定端口的示例

    c# 防火墻添加/刪除 特定端口的示例

    這篇文章主要介紹了c# 如何將特定端口加入防火墻中,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-10-10

最新評(píng)論

鹤壁市| 浮山县| 洛浦县| 连南| 北海市| 昆山市| 宜兰县| 林州市| 临漳县| 文成县| 岳池县| 石河子市| 郴州市| 宁城县| 枣庄市| 上犹县| 江孜县| 临夏县| 西乡县| 榕江县| 志丹县| 宜君县| 司法| 新竹县| 会东县| 团风县| 太湖县| 大余县| 东辽县| 兰州市| 社旗县| 铜山县| 庄浪县| 陆河县| 浑源县| 墨竹工卡县| 葵青区| 随州市| 南陵县| 祁连县| 余姚市|