自拍偷在线精品自拍偷|国产无码一区二区久久|最新版天堂资源中文官网|国产精品第一页爽爽影院|国产精品一区二区av不卡|久久久波多野av一区无码|国产欧美日本亚洲精品一4区|亚洲精品天堂在线观看2020

當(dāng)前位置:首頁(yè) > 軟件開(kāi)放 > 正文內(nèi)容

dede調(diào)用代碼(def調(diào)用)

軟件開(kāi)放11個(gè)月前 (03-13)370

前言

多線程無(wú)處不在,平常的開(kāi)發(fā)過(guò)程中,應(yīng)該算是最常用的基礎(chǔ)技術(shù)之一了。以下通過(guò)Thread、ThreadPool、再到Task、Parallel、線程鎖、線程取消等方面,一步步進(jìn)行演示多線程的一些基礎(chǔ)操作。歡迎大家圍觀。

如果大佬們有其他關(guān)于多線程的拓展,也歡迎在評(píng)論區(qū)進(jìn)行留言,大佬們的知識(shí)互助,是.NET生態(tài)發(fā)展的重要一環(huán),歡迎大佬們進(jìn)行留言,幫助更多的人。

以下博客內(nèi)容使用的一些環(huán)境:

系統(tǒng)環(huán)境:WIN 10

.NET 環(huán)境:.NET 6

VS 環(huán)境:VS 2022

其他:沒(méi)了

正文

1、先創(chuàng)建一個(gè).NET 6控制臺(tái)項(xiàng)目,用來(lái)當(dāng)做該博客文章的實(shí)驗(yàn)使用。

2、快速創(chuàng)建一個(gè)線程。ParameterizedThreadStart是一個(gè)委托,傳入的參數(shù)是一個(gè)object類型。

展開(kāi)全文

代碼

ParameterizedThreadStart threadStart = new((obj) = {

Console.WriteLine($ "當(dāng)前線程 的 ID = {Thread.CurrentThread.ManagedThreadId}");

});

Thread thread = new Thread(threadStart);

thread.Start;

Console.WriteLine($ "線程ID = {thread.ManagedThreadId}");

Console.ReadLine;

3、以上代碼執(zhí)行結(jié)果下圖所示

4、新建一個(gè)類TestThread以及一個(gè)測(cè)試方法,用來(lái)做測(cè)試使用。

5、在program里面,把輸出改成調(diào)用上面的方法再進(jìn)行測(cè)試一下。

6、執(zhí)行以后的輸出結(jié)果,如下圖所示

7、線程的等待(睡眠)。最簡(jiǎn)單的方式,是直接 Thread.Sleep(毫秒);

8、Thread的Join方法。代表線程執(zhí)行完畢以后,才可以繼續(xù)執(zhí)行后續(xù)的代碼。

如下圖所示,在thread線程內(nèi)部執(zhí)行完成以后,很快就接著執(zhí)行最后的打印輸出方法了。

可以和以上的第7點(diǎn)進(jìn)行比較輸出結(jié)果。

9、Thread的Join方法,還可以傳入?yún)?shù),參數(shù)是毫秒值。

代表等下當(dāng)前線程執(zhí)行多長(zhǎng)時(shí)間,如果超出設(shè)定的毫秒數(shù),就不等了,直接執(zhí)行后續(xù)的代碼。

10、新增一個(gè)Test2方法,用來(lái)測(cè)試線程池ThreadPool使用。

11、WaitCallback也是一個(gè)委托。傳入需要在線程池內(nèi)執(zhí)行的方法名稱。

以下代碼內(nèi),“線程池”字符串為執(zhí)行的方法對(duì)應(yīng)的參數(shù)。

代碼

using MultiThread;

Console.WriteLine( "Hello, World!");

ThreadPool.QueueUserWorkItem(new WaitCallback(TestThread.Test2), "線程池");

Console.ReadLine;

12、除了直接傳入回調(diào)方法,也可以直接在線程池開(kāi)啟的方法內(nèi),直接寫(xiě)代碼塊來(lái)當(dāng)做多線程執(zhí)行的部分。如下圖所示,睡眠1000ms以及執(zhí)行的方法,在線程池內(nèi)運(yùn)行。

一般用 .Set; 和 .WaitOne; 結(jié)對(duì)進(jìn)行,如下圖代碼、注釋部分以及執(zhí)行結(jié)果。(可以對(duì)比輸出時(shí)間)

14、使用Task快讀創(chuàng)建一個(gè)線程。

如下圖所示。最簡(jiǎn)單的方法:Task.Run(={ 代碼塊;});

15、也可以用以下方式,手動(dòng)進(jìn)行start啟動(dòng),如圖的代碼所示。

16、也可以使用Task.Factory創(chuàng)建一個(gè)任務(wù)工廠來(lái)實(shí)現(xiàn)。

17、如果需要等待子線程執(zhí)行完畢,才執(zhí)行后續(xù)操作,可以使用Wait; 來(lái)實(shí)現(xiàn)。

18、如果只想等待子線程執(zhí)行指定的時(shí)間,可以通過(guò)使用 Wait(毫秒數(shù)); 來(lái)實(shí)現(xiàn)。

這樣等待,例如500ms以后,不管子線程是不是還在浪,都不會(huì)等待,直接繼續(xù)執(zhí)行后續(xù)代碼。

19、 如果要在等待一段時(shí)間以后執(zhí)行某些當(dāng)做,可以使用Task.Delay(時(shí)間毫秒數(shù)).ContinuwWith( 要執(zhí)行的代碼塊);

如下圖所示的代碼、注釋以及運(yùn)行輸出結(jié)果。

20、如果有多個(gè)任務(wù)在執(zhí)行期間,在任意一個(gè)線程執(zhí)行完畢以后進(jìn)行執(zhí)行某種操作,可以使用 ContinueWhenAny來(lái)進(jìn)行。

如下圖所示的代碼、注釋和運(yùn)行結(jié)果,以及圖后附有源碼。

代碼

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} Hello, World!");

Task[] tasks = new Task[3];

TaskFactory factory = new;

tasks[0] = factory.StartNew(x = {

Thread.Sleep(1000);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} tasks 0");

},null);

tasks[1] = factory.StartNew(x = {

Thread.Sleep(2000);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} tasks 1");

}, null);

tasks[2] = factory.StartNew(x = {

Thread.Sleep(3000);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} tasks 2");

}, null);

factory.ContinueWhenAny(tasks, x =

{

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 我不曉得要打印啥子 ~ ~ ");

});

Console.ReadLine;

21、如果要等任務(wù)全部執(zhí)行完畢以后才執(zhí)行某個(gè)代碼塊,可以使用ContinueWhenAll。

22、使用TaskWaitAny 也可以實(shí)現(xiàn)任意任務(wù)執(zhí)行完畢以后,執(zhí)行后續(xù)動(dòng)作。但是會(huì)占用主線程資源。

如圖所示代碼,大佬們應(yīng)該可以看出來(lái)為什么了。

23、同樣的,Task也可以在等待全部任務(wù)執(zhí)行完畢以后進(jìn)行執(zhí)行后續(xù)動(dòng)作。如下圖演示。

24、Parallel允許線程并行執(zhí)行。同時(shí)最大線程執(zhí)行數(shù)量,類似于ThreadPool可以設(shè)置最大并發(fā)數(shù)量類似。其他不多說(shuō),看以下的代碼和演示效果。

代碼

using MultiThread;

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} Hello, World!");

ParallelOptions parallelOptions = new;

parallelOptions.MaxDegreeOfParallelism = 3;

Parallel.Invoke(parallelOptions,

=

{

Thread.Sleep(1000);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} para1");

},

=

{

Thread.Sleep(2000);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} para2");

},

=

{

Thread.Sleep(3000);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} para3");

});

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 我不曉得要打印啥子 ~ ~ ");

Console.ReadLine;

25、Parallel也可以遍歷執(zhí)行。

代碼

using MultiThread;

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} Hello, World!");

ParallelOptions parallelOptions = new;

parallelOptions.MaxDegreeOfParallelism = 3;

Parallel.For(0, 10,parallelOptions, s =

{

Thread.Sleep(100);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} para{s}");

});

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 我不曉得要打印啥子 ~ ~ ");

Console.ReadLine;

26、新增一個(gè)方法,用來(lái)測(cè)試多線程鎖使用。

27、在不加鎖的情況下執(zhí)行執(zhí)行以下代碼,方法體幾乎同時(shí)被執(zhí)行。但是實(shí)際上方法體如果只允許被同時(shí)一個(gè)線程訪問(wèn)的話,那么這樣搞肯定是會(huì)亂子的,所以需要鎖。

28、加了鎖以后,查看到執(zhí)行的結(jié)果,時(shí)間間隔基本上是1s左右,說(shuō)明該方法體確實(shí)一次只被一個(gè)線程調(diào)用了。

29、另一種鎖(原子鎖),可以定義一個(gè)變量來(lái)進(jìn)行原子交換。它的使用場(chǎng)景,一般是在輪詢進(jìn)行處理某些業(yè)務(wù)的時(shí)候,并且同時(shí)只允許一個(gè)線程進(jìn)來(lái),就可以使用這種鎖。

和lock鎖區(qū)別:lock鎖是代碼還沒(méi)執(zhí)行完,線程會(huì)一直等待,等執(zhí)行完了就會(huì)繼續(xù)進(jìn)來(lái)。

如果線程一直被創(chuàng)建,lock外邊會(huì)堆積越來(lái)越多的線程和資源,最嚴(yán)重的情況會(huì)導(dǎo)致系統(tǒng)內(nèi)存不斷飆升直到爆滿;

原子鎖的作用是,用于驗(yàn)證代碼塊是不是執(zhí)行完了,還沒(méi)執(zhí)行完,就不鳥(niǎo)他了,線程也不會(huì)等待下去,而是直接跳過(guò)這部分的代碼,繼續(xù)執(zhí)行后續(xù)的操作。如果后續(xù)沒(méi)事情做了,那該干嘛干嘛了。

30、原子鎖執(zhí)行效果如下,一部分線程判斷到代碼被鎖住,就跳過(guò)不管了,所以就不會(huì)有輸出。

31、測(cè)試線程取消。先開(kāi)啟一些線程,以及有關(guān)的操作,如下圖所示。

32、然后執(zhí)行。結(jié)果比較尷尬,顯示都是第100號(hào)線程,這是因?yàn)門ask是多線程,在創(chuàng)建過(guò)程中,可能已經(jīng)讓i都執(zhí)行到頭了,所以再次獲取到的i都是最后的值,即100.

33、在創(chuàng)建任務(wù)之前,引入一個(gè)中間變量,用來(lái)代替被遍歷的i。然后執(zhí)行結(jié)果和其他代碼說(shuō)明,如圖所示。

34、看不到異常信息,那改成Task直接走一波,然后通過(guò)Task.WaitAll;進(jìn)行捕捉異常信息。

如代碼注釋和演示截圖所示。

代碼

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} Hello, World!");

try

{

Task[] tasks = new Task[100];

CancellationTokenSource cancellation = new CancellationTokenSource;

for(int i = 0; i 100; i++)

{

string str = i.ToString;

tasks[i]= Task.Run( =

{

Thread.Sleep(100);

try

{

if(str == "10")

{

throw new Exception($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 第 -{str}- 號(hào)線程開(kāi)始放棄治療~~ 線程ID = {Thread.CurrentThread.ManagedThreadId}");

}

}

catch (Exception ex)

{

cancellation.Cancel; // 捕獲異常,線程后續(xù)所有的線程都取消操作

Console.WriteLine(ex.Message);

}

cancellation.Token.ThrowIfCancellationRequested;

if(cancellation.IsCancellationRequested == false) // 默認(rèn)為 false,代表正常

{

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 第 -{str}- 號(hào)線程執(zhí)行正常~~ 線程ID = {Thread.CurrentThread.ManagedThreadId}");

}

dede調(diào)用代碼(def調(diào)用)

else

{

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 第 -{str}- 號(hào)線程執(zhí)行異常~~ 線程ID = {Thread.CurrentThread.ManagedThreadId}");

}

}, cancellation.Token);

}

Task.WaitAll(tasks);

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 我不曉得要打印啥子 ~ ~ ");

}

catch (AggregateException ae)

{

foreach (var ex inae.InnerExceptions)

{

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} {ex.Message}");

}

}

Console.ReadLine;

35、以上就是這篇文章的全部?jī)?nèi)容。如果對(duì)你有幫助,歡迎點(diǎn)贊、轉(zhuǎn)發(fā)、或留言。

轉(zhuǎn)自:?果糖大數(shù)據(jù)科技

轉(zhuǎn)自:?果糖大數(shù)據(jù)科技

版權(quán)聲明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友供稿,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請(qǐng)轉(zhuǎn)告小編或者留言,本公眾號(hào)立即刪除。

支持小薇

關(guān)注公眾號(hào): DotNet開(kāi)發(fā)跳槽 ?

點(diǎn)分享

點(diǎn)收藏

點(diǎn)點(diǎn)贊

點(diǎn)在看

掃描二維碼推送至手機(jī)訪問(wèn)。

版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。

本文鏈接:http://m.thonggone.com/post/96204.html

標(biāo)簽: dede調(diào)用代碼

“dede調(diào)用代碼(def調(diào)用)” 的相關(guān)文章

中央4在線直播觀看高清臺(tái)(中央4電視直播在線觀看)

中央4在線直播觀看高清臺(tái)(中央4電視直播在線觀看)

今天給各位分享中央4在線直播觀看高清臺(tái)的知識(shí),其中也會(huì)對(duì)中央4電視直播在線觀看進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、中央4臺(tái)節(jié)目表回看在哪里看? 2、中央4臺(tái)在線直播今日關(guān)注 3、中央4套節(jié)目表 中央4臺(tái)節(jié)目表回看在哪里看? 央視網(wǎng)-節(jié)目...

uu8686游戲交易平臺(tái)怎么樣(uu868游戲交易官網(wǎng)客服)

uu8686游戲交易平臺(tái)怎么樣(uu868游戲交易官網(wǎng)客服)

今天給各位分享uu8686游戲交易平臺(tái)怎么樣的知識(shí),其中也會(huì)對(duì)uu868游戲交易官網(wǎng)客服進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、uu8968和8686購(gòu)寶通這兩個(gè)游戲交易平臺(tái)可靠嗎?可不可安全購(gòu)買? 2、有個(gè)叫UU86的交易平臺(tái)是騙人的 大家不要...

游戲直播平臺(tái)排名排行榜(直播游戲排行前十)

游戲直播平臺(tái)排名排行榜(直播游戲排行前十)

今天給各位分享游戲直播平臺(tái)排名排行榜的知識(shí),其中也會(huì)對(duì)直播游戲排行前十進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、現(xiàn)在游戲直播在哪個(gè)平臺(tái)好? 2、全網(wǎng)直播十大公會(huì)排名是什么? 3、這個(gè)在哪里直播? 4、游戲直播目前有哪些平臺(tái)?怎么合作的?...

房頂有十字梁怎么裝修(有十字梁怎么吊頂)

房頂有十字梁怎么裝修(有十字梁怎么吊頂)

本篇文章給大家談?wù)劮宽斢惺至涸趺囱b修,以及有十字梁怎么吊頂對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、老師你好!我家樓房入戶門口有個(gè)十字橫梁怎么辦好? 2、十字形梁怎么裝 3、客廳有橫梁如何裝修?用這6個(gè)方法,更漂亮 4、房頂中間有兩條長(zhǎng)梁怎么裝修好看?...

房頂裝修效果圖大全(室內(nèi)裝修房頂效果圖大全)

房頂裝修效果圖大全(室內(nèi)裝修房頂效果圖大全)

本篇文章給大家談?wù)劮宽斞b修效果圖大全,以及室內(nèi)裝修房頂效果圖大全對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、木結(jié)構(gòu)房頂想要隔熱,需要怎樣裝修? 2、裝修效果圖怎么做出來(lái)?裝修風(fēng)格有哪些 3、樓中樓怎么裝修效果圖 4、頂樓房頂是尖的,怎么裝修? 5、房頂...

異地買奶粉能不能查溯源碼(奶粉溯源碼查不到)

異地買奶粉能不能查溯源碼(奶粉溯源碼查不到)

今天給各位分享異地買奶粉能不能查溯源碼的知識(shí),其中也會(huì)對(duì)奶粉溯源碼查不到進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、思慕而奶粉異地能溯源嗎 2、圣元異地購(gòu)買掃不了追溯碼? 3、臻護(hù)高奶粉防偽碼跨區(qū)就不能查嗎 4、優(yōu)博瑞慕的奶粉從外地買能不能查...