欧美亚洲综合图区在线|天天射天天干国产成卜|99久久免费国产精精品|国产的欧美一区二区三区|日韩中文字幕无码不卡专区|亚麻成人aV极品一区二区|国产成人AV区一区二区三|成人免费一区二区三区视频网站

當前位置:首頁 > 軟件開放 > 正文內容

dede調用代碼(def調用)

軟件開放10個月前 (03-13)348

前言

多線程無處不在,平常的開發(fā)過程中,應該算是最常用的基礎技術之一了。以下通過Thread、ThreadPool、再到Task、Parallel、線程鎖、線程取消等方面,一步步進行演示多線程的一些基礎操作。歡迎大家圍觀。

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

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

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

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

VS 環(huán)境:VS 2022

其他:沒了

正文

1、先創(chuàng)建一個.NET 6控制臺項目,用來當做該博客文章的實驗使用。

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

展開全文

代碼

ParameterizedThreadStart threadStart = new((obj) = {

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

});

Thread thread = new Thread(threadStart);

thread.Start;

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

Console.ReadLine;

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

4、新建一個類TestThread以及一個測試方法,用來做測試使用。

5、在program里面,把輸出改成調用上面的方法再進行測試一下。

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

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

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

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

可以和以上的第7點進行比較輸出結果。

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

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

10、新增一個Test2方法,用來測試線程池ThreadPool使用。

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

以下代碼內,“線程池”字符串為執(zhí)行的方法對應的參數(shù)。

代碼

using MultiThread;

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

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

Console.ReadLine;

12、除了直接傳入回調方法,也可以直接在線程池開啟的方法內,直接寫代碼塊來當做多線程執(zhí)行的部分。如下圖所示,睡眠1000ms以及執(zhí)行的方法,在線程池內運行。

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

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

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

15、也可以用以下方式,手動進行start啟動,如圖的代碼所示。

16、也可以使用Task.Factory創(chuàng)建一個任務工廠來實現(xiàn)。

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

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

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

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

如下圖所示的代碼、注釋以及運行輸出結果。

20、如果有多個任務在執(zhí)行期間,在任意一個線程執(zhí)行完畢以后進行執(zhí)行某種操作,可以使用 ContinueWhenAny來進行。

如下圖所示的代碼、注釋和運行結果,以及圖后附有源碼。

代碼

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、如果要等任務全部執(zhí)行完畢以后才執(zhí)行某個代碼塊,可以使用ContinueWhenAll。

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

如圖所示代碼,大佬們應該可以看出來為什么了。

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

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

代碼

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、新增一個方法,用來測試多線程鎖使用。

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

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

29、另一種鎖(原子鎖),可以定義一個變量來進行原子交換。它的使用場景,一般是在輪詢進行處理某些業(yè)務的時候,并且同時只允許一個線程進來,就可以使用這種鎖。

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

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

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

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

31、測試線程取消。先開啟一些線程,以及有關的操作,如下圖所示。

32、然后執(zhí)行。結果比較尷尬,顯示都是第100號線程,這是因為Task是多線程,在創(chuàng)建過程中,可能已經讓i都執(zhí)行到頭了,所以再次獲取到的i都是最后的值,即100.

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

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

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

代碼

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}- 號線程開始放棄治療~~ 線程ID = {Thread.CurrentThread.ManagedThreadId}");

}

}

catch (Exception ex)

{

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

Console.WriteLine(ex.Message);

}

cancellation.Token.ThrowIfCancellationRequested;

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

{

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

}

dede調用代碼(def調用)

else

{

Console.WriteLine($ "{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff ")} 第 -{str}- 號線程執(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、以上就是這篇文章的全部內容。如果對你有幫助,歡迎點贊、轉發(fā)、或留言。

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

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

版權聲明:本文來源于網友收集或網友供稿,僅供學習交流之用,如果有侵權,請轉告小編或者留言,本公眾號立即刪除。

支持小薇

關注公眾號: DotNet開發(fā)跳槽 ?

點分享

點收藏

點點贊

點在看

掃描二維碼推送至手機訪問。

版權聲明:本文由飛速云SEO網絡優(yōu)化推廣發(fā)布,如需轉載請注明出處。

本文鏈接:http://www.landcheck.net/post/96204.html

分享給朋友:

“dede調用代碼(def調用)” 的相關文章

蘋果登錄ID時安全碼(登陸蘋果id安全碼是啥)

蘋果登錄ID時安全碼(登陸蘋果id安全碼是啥)

本篇文章給大家談談蘋果登錄ID時安全碼,以及登陸蘋果id安全碼是啥對應的知識點,希望對各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、使用蘋果id但是已經不用蘋果手機了安全碼怎么寫 2、請問,注冊蘋果id安全碼是什么 3、在蘋果手機中銀行卡的安全碼是什么意思? 使用蘋果id但是已經...

小橙子怎么了(小橙子姐姐怎么了)

小橙子怎么了(小橙子姐姐怎么了)

本篇文章給大家談談小橙子怎么了,以及小橙子姐姐怎么了對應的知識點,希望對各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、以家人之名小橙子從樓上摔下來了是第幾集? 2、小橙子爸爸怎么死的 3、《以家人之名》中小橙子演員曾被遺棄是怎么回事? 4、小橙子的日常生活,圈了多少的粉絲?優(yōu)秀...

最新版本三端傳奇手游發(fā)布網(3端傳奇手游)

最新版本三端傳奇手游發(fā)布網(3端傳奇手游)

今天給各位分享最新版本三端傳奇手游發(fā)布網的知識,其中也會對3端傳奇手游進行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關注本站,現(xiàn)在開始吧!本文目錄一覽: 1、傳奇手游下載最新版本網站安裝還需要錢嗎 2、開了個傳奇私服,發(fā)布哪個傳奇發(fā)布網可以上很多的人氣? 3、迷失星座天馬行空傳奇有三端版嗎...

長沙點石家裝口碑怎么樣(長沙點石家裝口碑怎么樣知乎)

長沙點石家裝口碑怎么樣(長沙點石家裝口碑怎么樣知乎)

今天給各位分享長沙點石家裝口碑怎么樣的知識,其中也會對長沙點石家裝口碑怎么樣知乎進行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關注本站,現(xiàn)在開始吧!本文目錄一覽: 1、長沙點石家裝公司咋樣 2、點石家裝和鴻揚家裝哪個好? 3、點石裝修很坑嗎 裝修公司如何選擇 4、長沙點石家裝怎么樣?有...

網紅小橙子媽媽(網紅小橙子媽媽叫什么)

網紅小橙子媽媽(網紅小橙子媽媽叫什么)

今天給各位分享網紅小橙子媽媽的知識,其中也會對網紅小橙子媽媽叫什么進行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關注本站,現(xiàn)在開始吧!本文目錄一覽: 1、2歲小橙子爸爸是干嘛的? 2、橙爸的真實身份是什么? 3、以家人之名小橙子演員曾被遺棄,她的生活究竟經歷了什么? 4、你怎么看待《以...

鼎多多游戲手游平臺命運戰(zhàn)歌ios(鼎多多游戲官網)

鼎多多游戲手游平臺命運戰(zhàn)歌ios(鼎多多游戲官網)

本篇文章給大家談談鼎多多游戲手游平臺命運戰(zhàn)歌ios,以及鼎多多游戲官網對應的知識點,希望對各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、戰(zhàn)歌蘋果ios下載地址是多少? 2、《命運戰(zhàn)歌》清明節(jié)青團配方是什么? 3、命運戰(zhàn)歌翻牌游戲在哪里玩 4、命運戰(zhàn)歌小程序用戶能上APP嗎 戰(zhàn)...