亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實(shí)現(xiàn)多線程啟動(dòng)停止暫停繼續(xù)的示例代碼

 更新時(shí)間:2025年01月21日 10:08:12   作者:上位機(jī)付工  
本文主要介紹了C#實(shí)現(xiàn)多線程啟動(dòng)停止暫停繼續(xù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

大部分初學(xué)者在學(xué)習(xí)C#上位機(jī)編程時(shí),多線程是一個(gè)很難逾越的鴻溝,不合理地使用多線程,會(huì)導(dǎo)致經(jīng)常出現(xiàn)各種奇怪的問(wèn)題,這也是很多初學(xué)者不敢使用多線程的原因。但是在實(shí)際開(kāi)發(fā)中,多線程是一個(gè)不可避免的技術(shù)棧,基本上每個(gè)項(xiàng)目都會(huì)使用到,因此學(xué)好多線程技術(shù),很重要。

一、多線程原理

首先,我們要了解什么是多線程,多線程是一種技術(shù),能夠讓一個(gè)程序同時(shí)運(yùn)行多個(gè)獨(dú)立的執(zhí)行流程,這個(gè)執(zhí)行流程即線程,這樣就可以提高程序的并發(fā)性和效率,使程序能夠更有效地利用系統(tǒng)資源。

打個(gè)比方,剛創(chuàng)業(yè)的時(shí)候,我們可能是一個(gè)人身兼多職,既要對(duì)接業(yè)務(wù),又要做技術(shù),還需要管理財(cái)務(wù),雖然你可以同時(shí)做這些事情,但畢竟只有一個(gè)人,這里的同時(shí),其實(shí)是靠“時(shí)間管理”來(lái)實(shí)現(xiàn)的,這就是單核CPU實(shí)現(xiàn)多線程的原理,依靠時(shí)間片切換來(lái)實(shí)現(xiàn)多個(gè)任務(wù),這個(gè)時(shí)間片很短,通常在10-100ms數(shù)量級(jí),因此,讓我們感覺(jué)是同時(shí)進(jìn)行的。

隨著技術(shù)的不斷發(fā)展,現(xiàn)在的計(jì)算機(jī)CPU基本上都是多核的。8核、16核,都很常見(jiàn),多核意味著有多個(gè)核心,可以同時(shí)運(yùn)行多個(gè)任務(wù)。

因此,多核CPU上的多線程才是真正的多線程,它能讓你的多段邏輯同時(shí)工作,多線程,可以真正發(fā)揮出多核CPU的優(yōu)勢(shì)來(lái),達(dá)到充分利用CPU的目的。

如果你做項(xiàng)目不使用多線程,不僅是技術(shù)的問(wèn)題,也是對(duì)電腦資源的極大浪費(fèi),就像買了一輛性能車,但是只用來(lái)日常代步。

二、多線程發(fā)展

我們知道了多線程技術(shù)可以保證我們代碼的高效運(yùn)行,提高CPU資源的使用率,為什么很多人不敢使用,主要是因?yàn)槎嗑€程如果使用不當(dāng),容易出現(xiàn)各種奇怪的問(wèn)題。

我們必須要明確一點(diǎn),多線程是“不可控的”,不要把多線程當(dāng)做一個(gè)開(kāi)關(guān),需要的時(shí)候就開(kāi)一下,不需要的時(shí)候就關(guān)閉一下。從微觀角度來(lái)看,多線程是靠CPU調(diào)度來(lái)實(shí)現(xiàn)的,我們常說(shuō)的開(kāi)啟多線程,只是告訴CPU,這個(gè)線程可以開(kāi)了,但是至于是立即開(kāi),還是等一會(huì)再開(kāi),這個(gè)是由CPU調(diào)度決定的,對(duì)于關(guān)閉多線程也是一樣。

我們后續(xù)提到的控制多線程啟動(dòng)、停止、暫停、繼續(xù),這些都是.NET框架中提供的一些接口(方法)給開(kāi)發(fā)人員,這樣程序員就可以間接地實(shí)現(xiàn)多線程。

微軟的多線程技術(shù)也是在一直發(fā)展中,在.NET 1.0中就出現(xiàn)了多線程Thread,到2.0時(shí)推出了ThreadPool線程池,再到3.0是出現(xiàn)了Task,Task也是我們目前使用比較多的,Task被稱之為多線程的最佳實(shí)踐,再到4.0時(shí)推出Parallel并行編程,再到4.5推出async/await語(yǔ)法糖,它讓我們可以用同步方法來(lái)實(shí)現(xiàn)異步編程。

圖片

三、多線程啟停

Task是我們使用多線程開(kāi)發(fā)中經(jīng)常使用的一個(gè)類,這個(gè)類中提供了豐富的API函數(shù),讓我們可以很方便地對(duì)多線程進(jìn)行管理,包括開(kāi)啟多線程了,就有很多種方法,比如Task.Run、Task.Factory.StartNew、Start等,由于篇幅有限,這里以其中一種進(jìn)行說(shuō)明。

我們來(lái)使用多線程實(shí)現(xiàn)一個(gè)簡(jiǎn)單的案例,我們來(lái)做一個(gè)線程任務(wù),這個(gè)任務(wù)很簡(jiǎn)單,就是讓一個(gè)值類型的變量,每間隔100ms,自增一次,到一個(gè)值后,再0開(kāi)始重新計(jì)數(shù),然后將這個(gè)值顯示在界面上,界面如下所示:

圖片

所以該任務(wù)執(zhí)行代碼如下:

圖片

我們可以看到在方法里調(diào)用了一個(gè)cts對(duì)象,這個(gè)對(duì)象就是CancellationTokenSource的對(duì)象,因此我們需要?jiǎng)?chuàng)建一個(gè)CancellationTokenSource對(duì)象cts,同時(shí)在屬性CurrentValue中,要顯示控件的值,這里需要用到委托實(shí)現(xiàn)跨線程訪問(wèn)的問(wèn)題,這個(gè)我們后續(xù)專題講解,代碼如下:

圖片

然后在啟動(dòng)線程按鈕的事件里,編寫代碼如下:

圖片

停止線程按鈕的事件里,只需要調(diào)用cts的Cancel方法即可:

圖片

我們可以看到,這里就是通過(guò)cts來(lái)控制cts的IsCancellationRequested屬性,進(jìn)而實(shí)現(xiàn)多線程的控制,這里的cts.IsCancellationRequested類似于一個(gè)布爾類型的標(biāo)志位,但是CancellationTokenSource的作用不僅如此,還可以在此基礎(chǔ)上實(shí)現(xiàn)多線程超時(shí)判斷,注冊(cè)事件等更復(fù)雜的多線程操作。

四、多線程暫停繼續(xù)

多線程的暫停繼續(xù),.NET為我們提供了另外一個(gè)對(duì)象——ManualResetEvent,這個(gè)對(duì)象會(huì)有一個(gè)值,這個(gè)值是布爾類型,就像一個(gè)門閘一樣,True是打開(kāi)門閘,F(xiàn)alse是關(guān)閉門閘,所以想要暫停多線程就調(diào)用這個(gè)對(duì)象的Reset方法,想要繼續(xù)多線程就調(diào)用這個(gè)對(duì)象的Set方法,使用非常簡(jiǎn)單。

首先我們創(chuàng)建一下這個(gè)對(duì)象,可以通過(guò)構(gòu)造方法,給這個(gè)對(duì)象賦初始值,我這里為True,這樣就能直接運(yùn)行,不會(huì)阻塞,代碼如下:

圖片

但是如果希望這個(gè)對(duì)象與多線程有所聯(lián)系,必須要在多線程的方法里體現(xiàn)這個(gè)對(duì)象的作用,這個(gè)是調(diào)用這個(gè)對(duì)象的WaitOne方法,表示在調(diào)用的地方阻塞住,通過(guò)判斷True或者False來(lái)決定是否繼續(xù)執(zhí)行,就像大家開(kāi)車過(guò)高速收費(fèi)站一樣,即使現(xiàn)在普遍采用ETC了,在入口也需要減速,有一個(gè)ETC識(shí)別的過(guò)程,識(shí)別成功才會(huì)抬桿,識(shí)別不對(duì),桿子是不會(huì)自動(dòng)抬起的,這個(gè)是一樣的道理。

所以線程執(zhí)行代碼修改如下:

圖片

對(duì)比一下,其實(shí)就是加了一個(gè)manual.WaitOne()。

線程暫停繼續(xù)代碼如下:

圖片

暫停繼續(xù)的使用除了ManualResetEvent,還有一個(gè)AutoResetEvent,AutoResetEvent和ManualResetEvent的用法基本上是一樣的,這里就不過(guò)多贅述,大家可以自己嘗試一下。

這兩者的區(qū)別在于一個(gè)是手動(dòng),一個(gè)是自動(dòng),AutoResetEvent會(huì)在置位之后自動(dòng)復(fù)位,這樣體現(xiàn)在多線程里,就是會(huì)只執(zhí)行一次,就像大家進(jìn)小區(qū)一樣,如果有10輛車在排隊(duì),這時(shí)候如果自動(dòng)模式,每次都要抬桿落桿,每次只允許進(jìn)一輛車,如果是手動(dòng)模式,可以由保安控制門閘打開(kāi),等10輛車都進(jìn)去之后,再由保安將門閘關(guān)閉。

到此這篇關(guān)于C#實(shí)現(xiàn)多線程啟動(dòng)停止暫停繼續(xù)的示例代碼的文章就介紹到這了,更多相關(guān)C# 多線程啟動(dòng)停止內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Winform基于多線程實(shí)現(xiàn)每隔1分鐘執(zhí)行一段代碼

    Winform基于多線程實(shí)現(xiàn)每隔1分鐘執(zhí)行一段代碼

    這篇文章主要介紹了Winform基于多線程實(shí)現(xiàn)每隔1分鐘執(zhí)行一段代碼的方法,設(shè)計(jì)線程的操作及時(shí)間函數(shù)的用法,需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)單鏈表(線性表)完整實(shí)例

    C#實(shí)現(xiàn)單鏈表(線性表)完整實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)單鏈表(線性表)的方法,結(jié)合完整實(shí)例形式分析了單鏈表的原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-06-06
  • C#使用System.Net.Mail類實(shí)現(xiàn)郵件發(fā)送

    C#使用System.Net.Mail類實(shí)現(xiàn)郵件發(fā)送

    這篇文章介紹了C#使用System.Net.Mail類實(shí)現(xiàn)郵件發(fā)送的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • C# using三種使用方法

    C# using三種使用方法

    這篇文章主要為大家詳細(xì)介紹了C# using三種使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二

    C#編程自學(xué)之?dāng)?shù)據(jù)類型和變量二

    這篇文章繼續(xù)介紹了C#數(shù)據(jù)類型和變量,是對(duì)上一篇文章的補(bǔ)充,希望對(duì)大家的學(xué)習(xí)有所幫助。
    2015-10-10
  • c#與js隨機(jī)數(shù)生成方法

    c#與js隨機(jī)數(shù)生成方法

    這篇文章主要介紹了c#與js隨機(jī)數(shù)生成方法,實(shí)例分析了C#與js生成隨機(jī)數(shù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • C#中的Hangfire和Quartz.NET 任務(wù)調(diào)度的區(qū)別解析

    C#中的Hangfire和Quartz.NET 任務(wù)調(diào)度的區(qū)別解析

    Hangfire 和 Quartz.NET 是兩種常見(jiàn)的 C# 任務(wù)調(diào)度庫(kù),它們有不同的特點(diǎn)和使用場(chǎng)景,本文給大家介紹C#中的Hangfire和Quartz.NET 任務(wù)調(diào)度的區(qū)別,感興趣的朋友一起看看吧
    2024-08-08
  • C#中可枚舉類型詳解

    C#中可枚舉類型詳解

    這篇文章主要介紹了C#中可枚舉類型,IEnumerable和IEnumerator接口j及其泛型實(shí)現(xiàn)和迭代器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C#設(shè)計(jì)模式之觀察者模式實(shí)例講解

    C#設(shè)計(jì)模式之觀察者模式實(shí)例講解

    這篇文章主要介紹了C#設(shè)計(jì)模式之觀察者模式實(shí)例講解,本文詳細(xì)講解了觀察者模式的定義、優(yōu)缺點(diǎn)、代碼實(shí)例等,需要的朋友可以參考下
    2014-10-10
  • C#用遞歸算法解決八皇后問(wèn)題

    C#用遞歸算法解決八皇后問(wèn)題

    在軟件編程中,這種思路確是一種解決問(wèn)題最簡(jiǎn)單的算法,它通過(guò)一種類似于蠻干的思路,一步一步地往前走,每走一步都更靠近目標(biāo)結(jié)果一些,直到遇到障礙物,我們才考慮往回走。
    2016-06-06

最新評(píng)論