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

C#?異步多線程入門基礎(chǔ)

 更新時間:2021年11月22日 14:34:09   作者:菜鳥厚非  
今天來談?wù)劗惒蕉嗑€程,做網(wǎng)站服務(wù)的同學都知道,Web?應(yīng)用是天生的異步多線程,無論做?Winform、WPF、Webform?等,異步多線程的應(yīng)用是非常廣泛的。本篇主要講解一些概念性東西,與一些實例來入門異步多線程

下一篇:C# 異步多線程入門到精通之Thread篇

進程、線程

1. 進程

首先了解,什么是線程? 即一個應(yīng)用程序運行時,占用資源的綜合是一個進程。Windows 任務(wù)管理器里面可以看到,里面一個個都是在運行的進程。

在這里插入圖片描述

2. 線程

線程是執(zhí)行流的最小單位。線程其實是看不到的,其實也可以,例如 Windows 任務(wù)管理器:正在運行 272 個進程,272 個進程運行了 3909 個線程,也就是一個進程可以擁有多個線程。

在這里插入圖片描述

分時、分片

現(xiàn)在有個怪相,CPU 實在太快了,內(nèi)存顯卡其他硬件資源其實都跟不上 CPU 的速度,于是就產(chǎn)生了分片的概念。從微觀角度來講,以前電腦很多都是單核,一時刻只能執(zhí)行一個線程,按照這個道理,為什么我們的計算機還可以同時運行許多個應(yīng)用呢。但從宏觀來說是并發(fā)的,多個應(yīng)用同時執(zhí)行,我們既可以掃雷也可以完蜘蛛紙牌還可以聽音樂。這就是分片,分片會產(chǎn)生一個上下文,假設(shè)當前執(zhí)行掃雷線程,下一個時刻執(zhí)行蜘蛛紙牌線程,CPU 會將掃雷線程上下文保存起來,切換成蜘蛛紙牌線程,這樣進行來回調(diào)度,從宏觀來看是并發(fā)的。

這個補充一點額外知識,多 CPU 多核,本身就可以完成多個線程的計算,可以獨立工作。4核8線程,核就是物理的核,線程是虛擬的核,每個核可以進行分片做并發(fā)的。

同步、異步

我們開發(fā)人員口中常說的同步、異步,其實是對方法執(zhí)行的描述。因為編程語言本身是沒有線程的,它只能去向操作系統(tǒng)申請線程,去執(zhí)行代碼。

同步方法,代碼執(zhí)行第一行到最后一行依次執(zhí)行到結(jié)束,完成第一行之后進入下第二行直到最后一行,這就是同步,阻塞式的。

異步方法,不會等待當前行執(zhí)行完成,就會進行下一行執(zhí)行代碼,非阻塞式的。

異步、多線程

多線程,就是多個執(zhí)行流,同時執(zhí)行。在 C# 中多線程就是多個并發(fā)的 Thread 開啟多個線程處理任務(wù),利用的可能是 CPU 的多核,也可能是單核 CPU 分片完成執(zhí)行的任務(wù)。

異步,其實是硬件式的異步,其實這個不太好理解。這里就拿文件寫入來說

多線程情況,線程會一直從文件寫入開始到結(jié)束,都參與工作這件事,也就是 CPU 會處理寫文件操作,線程會一直等待 CPU 向磁盤寫入文件直到完成。

異步情況,線程會給 CPU 發(fā)個指令與文件流交個操作系統(tǒng),線程就可以忙別的事情去了,也就是利用硬件的特性,發(fā)個指令讓操作系統(tǒng)完成文件寫入,線程去執(zhí)行其他任務(wù),等 CPU 寫完后發(fā)個指令回來,通知到線程。

有同學會問這個異步怎么寫,其實在程序中是寫不了這個的,這是操作系統(tǒng)底層的東西,在 WPF 里面就可以直接調(diào)用。 C# 中常說的異步多線程指的是 ThreadPool、Task ,都是基于 Thread 完成的,只是 C# 語言進行了封裝的。

異步多線程效率

說起異步很多人都知道,同步方法慢,異步多線程快,這個大家心里面都是這么認為的。但效率究竟提升了多少呢

我們看下面程序,定義一個普通方法 Sum 做些 CPU 密集型運算,然后在 Main 方法,分別同步與異步,執(zhí)行 Sum 方法。即同樣的任務(wù)使用單線程(主線程)運行五次,再使用多線程開啟 5 個線程,分別執(zhí)行。

public static void Sum(int f)
{
    Console.WriteLine($"第{f}次  start:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");
    decimal s = 0;
    for (int i = 0; i < 1000000000; i++)
    {
        s = s + i;
    }
    Console.WriteLine($"第{f}次  end:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");
}

static void Main(string[] args)
{
    Console.WriteLine($"同步 start:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");
    for (int i = 0; i < 5; i++)
    {
        Sum(i);
    }
    Console.WriteLine($"同步 end:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");

    Console.WriteLine();

    Console.WriteLine($"異步 start:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");
    for (int i = 0; i < 5; i++)
    {
        Action<int> action = Sum;
        action.BeginInvoke(i,null,null);
    }
    Console.WriteLine($"異步 end:{DateTime.Now.ToLongTimeString()},Thread:{Thread.CurrentThread.ManagedThreadId}");

    Console.ReadKey();
}

在這里插入圖片描述

啟動程序,可以看到,同步方法1個線程執(zhí)行了 2 分 40 秒,異步方法 5 個線程執(zhí)行了 52 秒,很顯然異步方法快與同步方法四倍多。

在這里插入圖片描述

說到這可能有的同學會發(fā)現(xiàn),同步1個線程,異步5個線程,為什么效率不提升五倍呢,不是線性增長呢?其實,異步效率提升受限于資源限制、上下文切換成本

上面我們說過 CPU 的分時分片,即使單核也可以同時運行多個程序,那既要馬兒跑得快,又要馬兒不吃草,怎么可能呢,這就是上下文切換的管理成本。

資源限制,異步效率不高也可能資源不夠。如下,我們啟動資源管理器并啟動程序,可以看到同步時 CPU 使用的資源并不高執(zhí)行但時間長,當多線程時 CPU 達到了 100% 但執(zhí)行時間短,也就是一種資源換時間策略。

在這里插入圖片描述

多線程無序性

因為計算機的分時分片,會使得多線程無序。即啟動無序、執(zhí)行無序、結(jié)束無序。

啟動無序,線程是操作系統(tǒng)的,C# 并沒有線程,C# 需要向操作系統(tǒng)申請線程,假設(shè)同時或者有序向向操作系統(tǒng)申請線程,但操作系統(tǒng)并不是按順序給線程,可能后申請的先拿到線程,也可能先申請的后拿到線程。

執(zhí)行無序,程序拿到了操作系統(tǒng)分片的線程后,我們執(zhí)行的任務(wù)運氣好了可能后申請的先執(zhí)行,運氣差了先申請的后執(zhí)行,都是非常常見的。

結(jié)束無序,這個受執(zhí)行無序、分時分片運氣、任務(wù)量的影響。開始執(zhí)行無序已經(jīng)說過;分時分片運氣,當我的 CPU 執(zhí)行一個任務(wù),并不是任務(wù)執(zhí)行完了才會進行上下文的切換去執(zhí)行其他任務(wù),而是可以隨時暫停切換執(zhí)行其他任務(wù)的;任務(wù)量就是,做的任務(wù)多少不同,即使同一時刻開始執(zhí)行,完成的時間必然不一樣。

擴展

1 . 同一個線程做相同的事情,耗時時間一樣嗎?
答案:不一樣,應(yīng)為CPU是分片的,運氣好瘋狂拿時間片,運氣不好十次也拿不到。

異步多線程版本

在 .NET 中隨著時間的發(fā)展,線程是有許多個版本的 1.0 Thread、2.0 TthreadPool、3.0 Task、4.0 Parallel 等,每個版本都是其特點,后面我們一一進行講解。

以上就是C# 異步多線程入門基礎(chǔ)的詳細內(nèi)容,更多關(guān)于C# 異步多線程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實現(xiàn)Winform鼠標拖動窗口大小時設(shè)定窗口最小尺寸的方法

    C#實現(xiàn)Winform鼠標拖動窗口大小時設(shè)定窗口最小尺寸的方法

    這篇文章主要介紹了C#實現(xiàn)Winform鼠標拖動窗口大小時設(shè)定窗口最小尺寸的方法,涉及WinForm改變窗口大小時動態(tài)判斷當前窗口尺寸的相關(guān)技巧,非常簡單實用,需要的朋友可以參考下
    2015-11-11
  • 基于運算符重載的那些事

    基于運算符重載的那些事

    本篇文章是對關(guān)于運算符重載的介紹引用了百科里的一個有趣的解釋。需要的朋友參考下
    2013-05-05
  • 在WPF中實現(xiàn)平滑滾動的方法詳解

    在WPF中實現(xiàn)平滑滾動的方法詳解

    這篇文章介紹了WPF實現(xiàn)平滑滾動的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#實現(xiàn)將Doc文檔轉(zhuǎn)換成rtf格式的方法示例

    C#實現(xiàn)將Doc文檔轉(zhuǎn)換成rtf格式的方法示例

    這篇文章主要介紹了C#實現(xiàn)將Doc文檔轉(zhuǎn)換成rtf格式的方法,結(jié)合實例形式分析了C#針對word文件的讀取及文檔格式轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • C# 實現(xiàn)顏色的梯度漸變案例

    C# 實現(xiàn)顏色的梯度漸變案例

    這篇文章主要介紹了C# 實現(xiàn)顏色的梯度漸變案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C#實現(xiàn)圖像選擇驗證碼的示例代碼

    C#實現(xiàn)圖像選擇驗證碼的示例代碼

    為了防止網(wǎng)站被非法登陸,網(wǎng)站一般通過驗證碼的方式,防止黑客用軟件非法登陸,本文主要介紹了C#實現(xiàn)圖像選擇驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • C#連接MySQL數(shù)據(jù)庫的方法步驟

    C#連接MySQL數(shù)據(jù)庫的方法步驟

    最近兩天在解決C#連接MySql數(shù)據(jù)庫的問題,通過不同的從網(wǎng)上學習,最終找到了解決的辦法,下面這篇文章主要給大家介紹了關(guān)于C#連接MySQL數(shù)據(jù)庫的方法步驟,需要的朋友可以參考下
    2023-01-01
  • C#?NModbus?RTU通信實現(xiàn)方法詳解

    C#?NModbus?RTU通信實現(xiàn)方法詳解

    Modbus協(xié)議時應(yīng)用于電子控制器上的一種通用語言,通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)/串口和其它設(shè)備之間可以進行通信,下面我們就來看看具體實現(xiàn)吧
    2024-11-11
  • UnityShader3實現(xiàn)2D描邊效果

    UnityShader3實現(xiàn)2D描邊效果

    這篇文章主要為大家詳細介紹了UnityShader3實現(xiàn)2D描邊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#實現(xiàn)Word和ODT文檔相互轉(zhuǎn)換詳解

    C#實現(xiàn)Word和ODT文檔相互轉(zhuǎn)換詳解

    ODT文檔格式一種開放文檔格式(OpenDocument Text)。本文以C#及VB.NET代碼展示ODT和Word文檔之間相互轉(zhuǎn)換的方法,感興趣的可以學習一下
    2022-05-05

最新評論

阳信县| 福安市| 襄汾县| 清水县| 阿巴嘎旗| 喜德县| 明溪县| 公安县| 莎车县| 台东县| 新蔡县| 桂东县| 湖北省| 无棣县| 遵化市| 陇西县| 黄平县| 遵义县| 洪湖市| 广西| 海原县| 昌江| 会同县| 阿拉善盟| 高平市| 弥渡县| 无棣县| 阆中市| 兴城市| 德钦县| 新安县| 湘西| 秦皇岛市| 霍城县| 淮南市| 龙里县| 丰台区| 武陟县| 蒙阴县| 丹寨县| 蕉岭县|