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

c# 面試必備線(xiàn)程基礎(chǔ)知識(shí)點(diǎn)

 更新時(shí)間:2020年11月10日 11:10:17   作者:精致碼農(nóng) • 王亮  
這篇文章主要介紹了c# 面試必備線(xiàn)程基礎(chǔ)知識(shí)點(diǎn),幫助大家更好的鞏固,掌握線(xiàn)程的基礎(chǔ)知識(shí),感興趣的朋友可以了解下

線(xiàn)程的知識(shí)太多,知識(shí)點(diǎn)有深有淺,往深的研究會(huì)涉及操作系統(tǒng)、CPU、內(nèi)存,往淺了說(shuō)就是一些語(yǔ)法。沒(méi)有一定的知識(shí)積累,很難把線(xiàn)程的知識(shí)寫(xiě)得全面,當(dāng)然我也沒(méi)有這個(gè)能力。所以想到一個(gè)點(diǎn)寫(xiě)一個(gè)點(diǎn),盡量總結(jié)一些有用的知識(shí)點(diǎn)。線(xiàn)程是個(gè)大話(huà)題,這個(gè)系列可能會(huì)有好幾遍關(guān)于線(xiàn)程的,先從基礎(chǔ)的開(kāi)始,熱熱身。

一些基礎(chǔ)概念

線(xiàn)程(Thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它是進(jìn)程中的實(shí)際運(yùn)作單位,一個(gè)進(jìn)程中可以啟動(dòng)多個(gè)線(xiàn)程,每個(gè)線(xiàn)程可以并行執(zhí)行不同的任務(wù)。嚴(yán)格意義上來(lái)說(shuō),同一時(shí)間可以并行運(yùn)行的線(xiàn)程數(shù)取決于 CPU 的核數(shù)。

根據(jù)線(xiàn)程運(yùn)行模式,可以把線(xiàn)程分為前臺(tái)線(xiàn)程、后臺(tái)線(xiàn)程和守護(hù)(Daemon)線(xiàn)程:

  • 前臺(tái)線(xiàn)程:主程序必須等待線(xiàn)程執(zhí)行完畢后才可退出程序。C# 中的 Thread 默認(rèn)為前臺(tái)線(xiàn)程,也可以設(shè)置為后臺(tái)線(xiàn)程。
  • 后臺(tái)線(xiàn)程:主程序執(zhí)行完畢立即跟隨退出,不管線(xiàn)程是否執(zhí)行完畢。C# 的 ThreadPool 管理的線(xiàn)程默認(rèn)為后臺(tái)線(xiàn)程。
  • 守護(hù)線(xiàn)程:守護(hù)線(xiàn)程擁有自動(dòng)結(jié)束自己生命周期的特點(diǎn),它通常被用來(lái)執(zhí)行一些后臺(tái)任務(wù)。

每次開(kāi)啟一個(gè)新的線(xiàn)程都要消耗一定的內(nèi)存,即使線(xiàn)程什么也不做,也會(huì)至少消耗 1M 左右的內(nèi)存。

多線(xiàn)程并行(Parallelism)和并發(fā)(Concurrency)的區(qū)別:

  • 并行:同一時(shí)刻有多條指令在多個(gè)處理器上同時(shí)執(zhí)行,無(wú)論從宏觀還是微觀上都是同時(shí)發(fā)生的。
  • 并發(fā):是指在同一時(shí)間段內(nèi),宏觀上看多個(gè)指令看起來(lái)是同時(shí)執(zhí)行,微觀上看是多個(gè)指令進(jìn)程在快速的切換執(zhí)行,同一時(shí)刻可能只有一條指令被執(zhí)行。

PS:以上概念來(lái)源 Google 的多個(gè)搜索結(jié)果,稍加整理。

Thread、ThreadPool 和 Task

對(duì) C# 開(kāi)發(fā)者來(lái)說(shuō),不可不理解清楚 Thread、ThreadPool 和 Task 這三個(gè)概念。這也是面試頻率很高的話(huà)題,在 StackOverflow 可以找到有很多不錯(cuò)的回答,我總結(jié)整理了一下。

Thread

Thread 是一個(gè)實(shí)際的操作系統(tǒng)級(jí)別的線(xiàn)程(OS 線(xiàn)程),有自己的棧和內(nèi)核資源。Thread 允許最高程度的控制,你可以 Abort、Suspend 或 Resume 一個(gè)線(xiàn)程,你還可以監(jiān)聽(tīng)它的狀態(tài),設(shè)置它的堆棧大小和 Culture 等屬性。Thread 的開(kāi)銷(xiāo)成本很高,你的每一個(gè)線(xiàn)程都會(huì)為它的堆棧消耗相對(duì)較多的內(nèi)存,并且在線(xiàn)程之間的處理器上下文切換時(shí)會(huì)增加額外的 CPU 開(kāi)銷(xiāo)。

ThreadPool

ThreadPool(線(xiàn)程池)是一堆線(xiàn)程的包裝器,由 CLR 維護(hù)。你對(duì)線(xiàn)程池中的線(xiàn)程沒(méi)有任何控制權(quán),你甚至無(wú)法知道線(xiàn)程池什么時(shí)候開(kāi)始執(zhí)行你提交的任務(wù),你只能控制線(xiàn)程池的大小。簡(jiǎn)單來(lái)說(shuō),線(xiàn)程池調(diào)用線(xiàn)程的機(jī)制是,它首先調(diào)用已創(chuàng)建的空閑線(xiàn)程來(lái)執(zhí)行你的任務(wù),如果當(dāng)前沒(méi)有空閑線(xiàn)程,可能會(huì)創(chuàng)建新線(xiàn)程,也可能會(huì)等待。

使用 ThreadPool 可以避免創(chuàng)建太多線(xiàn)程的開(kāi)銷(xiāo)。但是,如果你向 ThreadPool 提交了太多長(zhǎng)時(shí)間運(yùn)行的任務(wù),它可能會(huì)被填滿(mǎn),這時(shí)你提交的后面的任務(wù)可能最終會(huì)等待前面的長(zhǎng)時(shí)間運(yùn)行的任務(wù)執(zhí)行完成。此外,線(xiàn)程池沒(méi)有提供任何方法來(lái)檢測(cè)一個(gè)工作任務(wù)何時(shí)完成(不像 Thread.Join()),也沒(méi)有方法來(lái)獲取結(jié)果。因此,ThreadPool 最好用于調(diào)用者不需要結(jié)果的短時(shí)操作。

Task

Task 是 TPL(Task Parallel Library)提供一個(gè)類(lèi),它在 Thread 和 TheadPool 之間提供了兩全其美的解決方案。和 ThreadPool 一樣,Task 并不創(chuàng)建自己的OS 線(xiàn)程。相反,Task 是由 TaskScheduler 調(diào)度器執(zhí)行的,默認(rèn)的調(diào)度器只是在 ThreadPool 上運(yùn)行。

與 ThreadPool 不同的是,Task 還允許你知道它完成的時(shí)間,并獲取返回一個(gè)結(jié)果。你可以在現(xiàn)有的 Task 上調(diào)用 ContinueWith(),使它在任務(wù)完成后運(yùn)行更多的代碼(如果它已經(jīng)完成,就會(huì)立即運(yùn)行回調(diào))。

你也可以通過(guò)調(diào)用 Wait() 來(lái)同步等待一個(gè)任務(wù)的完成(或者,通過(guò)獲取它的 Result 屬性)。與 Thread.Join() 一樣,這將阻塞調(diào)用線(xiàn)程,直到任務(wù)完成。通常不建議同步等待任務(wù)執(zhí)行完成,它使調(diào)用線(xiàn)程無(wú)法進(jìn)行任何其他工作。如果當(dāng)前線(xiàn)程要等待其它線(xiàn)程任務(wù)執(zhí)行完成,建議使用 async/await 異步等待,這樣當(dāng)前線(xiàn)程可以空閑出來(lái)去處理其它任務(wù),比如在 await Task.Delay() 時(shí),并不占用線(xiàn)程資源。

由于任務(wù)仍然在 ThreadPool 上運(yùn)行,因此不應(yīng)該將其用于長(zhǎng)時(shí)任務(wù)的執(zhí)行,因?yàn)樗鼈儠?huì)填滿(mǎn)線(xiàn)程池并阻塞新的工作任務(wù)。相反,Task 提供了一個(gè) LongRunning 選項(xiàng),它將告訴 TaskScheduler 啟用一個(gè)新的線(xiàn)程,而不是在 ThreadPool 上運(yùn)行。

所有較新的上層多線(xiàn)程 API,包括 Parallel.ForEach()、PLINQ、async/await 等,都是建立在 Task 上的。

Thread 和 Task 簡(jiǎn)單示例

下面通過(guò)一個(gè)簡(jiǎn)單示例演示 Thread 和 Task 的使用,注意他們是如何創(chuàng)建、傳參、執(zhí)行和等待執(zhí)行完成的。

static void Main(string[] args)
{
  // 創(chuàng)建兩個(gè)新的 Thread
  var thread1 = new Thread(new ThreadStart(() => PerformAction("Thread", 1)));
  var thread2 = new Thread(new ThreadStart(() => PerformAction("Thread", 2)));

  // 開(kāi)始執(zhí)行線(xiàn)程任務(wù)
  thread1.Start();
  thread2.Start();

  // 等待兩個(gè)線(xiàn)程執(zhí)行完成
  thread1.Join();
  thread1.Join();

  Console.WriteLine("Theads done!");

  Console.WriteLine("===我是分隔線(xiàn)===");

  // 創(chuàng)建兩個(gè)新的 Task
  var task1 = Task.Run(() => PerformAction("Task", 1));
  var task2 = Task.Run(() => PerformAction("Task", 2));

  // 執(zhí)行并等待兩個(gè) Task 執(zhí)行完成
  Task.WaitAll(new[] { task1, task2 });

  Console.WriteLine("Tasks done!");

  Console.ReadKey();
}

static void PerformAction(string threadOrTask, int id)
{
  var rnd = new Random(id);
  for (int i = 0; i < 5; i++)
  {
    Console.WriteLine($"{threadOrTask}: {id}: {i}", id, i);
    Thread.Sleep(rnd.Next(0, 1000));
  }
}

運(yùn)行效果:

注意到,相比之下 Task 比 Thread 好用得多,加上前文 Task 和 Thread 的對(duì)比,對(duì)我們編碼的指導(dǎo)意義是:大多數(shù)情況我們應(yīng)該使用 Task,而不要直接使用 Thread,除非你明確知道你需要一個(gè)獨(dú)立的線(xiàn)程來(lái)執(zhí)行一個(gè)長(zhǎng)耗時(shí)的任務(wù)。

小結(jié)

本篇內(nèi)容很基礎(chǔ),整理了 C# 線(xiàn)程編程有關(guān)的重要概念,簡(jiǎn)單演示了 Thread 和 Task 的使用。Thread 和 Task 是高頻面試話(huà)題,尤其是 Thread 和 Task 的區(qū)別,Thread 更底層,Task 更抽象,回答好這類(lèi)面試題的關(guān)鍵點(diǎn)在 ThreadPool。

作者:精致碼農(nóng)

出處:http://cnblogs.com/willick

以上就是c# 面試必備線(xiàn)程基礎(chǔ)知識(shí)點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于c# 線(xiàn)程基礎(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法

    C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)年份計(jì)算生肖屬相的方法,涉及C#數(shù)組與字符串的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C# 創(chuàng)建,讀取,寫(xiě)入XML文件

    C# 創(chuàng)建,讀取,寫(xiě)入XML文件

    本篇文章主要介紹了C# 創(chuàng)建,讀取,寫(xiě)入XML文件的方法,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 深入理解C♯ 7.0中的Tuple特性

    深入理解C♯ 7.0中的Tuple特性

    這篇文章主要介紹了C#7中Tuple特性的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友可以們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-03-03
  • C#中async和await的深入分析

    C#中async和await的深入分析

    Async/Await是C# 5引入的關(guān)鍵字,用以提高用戶(hù)界面響應(yīng)能力和對(duì)Web資源的訪(fǎng)問(wèn)能力,同時(shí)它使異步代碼的編寫(xiě)變得更加容易,下面這篇文章主要給大家介紹了關(guān)于C#中async和await的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式

    C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式

    這篇文章主要介紹了C#字節(jié)數(shù)組(byte[])和字符串相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法

    C#使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法

    這篇文章主要為大家詳細(xì)介紹了C#如何使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-02-02
  • 最好用的WPF加載動(dòng)畫(huà)功能

    最好用的WPF加載動(dòng)畫(huà)功能

    當(dāng)開(kāi)發(fā)應(yīng)用程序時(shí),提供良好的用戶(hù)體驗(yàn)(UX)是至關(guān)重要的,加載動(dòng)畫(huà)作為一種有效的溝通工具,它不僅能告知用戶(hù)系統(tǒng)正在工作,還能夠通過(guò)視覺(jué)上的吸引力來(lái)增強(qiáng)整體用戶(hù)體驗(yàn),本文給大家介紹了最好用的WPF加載動(dòng)畫(huà)功能,需要的朋友可以參考下
    2025-01-01
  • C# 中使用正則表達(dá)式匹配字符的含義

    C# 中使用正則表達(dá)式匹配字符的含義

    正則表達(dá)式的作用用來(lái)描述字符串的特征。本文重點(diǎn)給大家介紹C# 中使用正則表達(dá)式匹配字符的含義,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-10-10
  • C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動(dòng)的方法

    C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動(dòng)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)ListView選中項(xiàng)向上或向下移動(dòng)的方法,通過(guò)兩個(gè)按鈕點(diǎn)擊事件實(shí)現(xiàn)ListView選中項(xiàng)的上下移動(dòng)功能,需要的朋友可以參考下
    2015-06-06
  • 在C#中獲取端口號(hào)與系統(tǒng)信息的高效實(shí)踐

    在C#中獲取端口號(hào)與系統(tǒng)信息的高效實(shí)踐

    在現(xiàn)代軟件開(kāi)發(fā)中,尤其是系統(tǒng)管理、運(yùn)維、監(jiān)控和性能優(yōu)化等場(chǎng)景中,了解計(jì)算機(jī)硬件和網(wǎng)絡(luò)的狀態(tài)至關(guān)重要,C# 作為一種廣泛應(yīng)用的編程語(yǔ)言,提供了豐富的 API 來(lái)幫助開(kāi)發(fā)者獲取計(jì)算機(jī)的硬件信息和網(wǎng)絡(luò)狀態(tài),本篇博客將帶你深入探索如何在 C# 中高效獲取端口號(hào)和系統(tǒng)信息
    2025-01-01

最新評(píng)論

法库县| 罗平县| 海城市| 栾川县| 贵州省| 崇明县| 本溪市| 河西区| 梧州市| 玉龙| 康马县| 恭城| 隆尧县| 桐庐县| 炉霍县| 阜南县| 莲花县| 龙门县| 阜宁县| 襄城县| 文成县| 环江| 黑龙江省| 寿阳县| 梓潼县| 扎赉特旗| 克山县| 贡觉县| 江门市| 华阴市| 全椒县| 金寨县| 淮滨县| 临澧县| 泰安市| 彭阳县| 大英县| 石门县| 广东省| 苍溪县| 五指山市|