日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C#多线程之旅(七)——终止线程

發(fā)布時(shí)間:2023/12/10 C# 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#多线程之旅(七)——终止线程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

閱讀目錄

  • 一、什么時(shí)候用Thread.Abort();
  • 二、Thread.Abort的用法
  • 三、無(wú)法終止線(xiàn)程的情形
  • 四、Catch塊中拋出異常
  • 五、Finally塊中拋出異常
  • 六、Abort調(diào)用的時(shí)間

先交代下背景,寫(xiě)《C#多線(xiàn)程之旅》這個(gè)系列文章主要是因?yàn)橐韵聨讉€(gè)原因:1.多線(xiàn)程在C/S和B/S架構(gòu)中用得是非常多的;2.而且多線(xiàn)程的使用是非常復(fù)雜的,如果沒(méi)有用好,容易造成很多問(wèn)題。

回到頂部

一、什么時(shí)候用Thread.Abort();

當(dāng)我們想要立即終止一個(gè)線(xiàn)程時(shí),可以用調(diào)用Thread.Abort方法來(lái)終止線(xiàn)程。這個(gè)和協(xié)作式取消不一樣。

終止當(dāng)前線(xiàn)程時(shí)會(huì)在當(dāng)前線(xiàn)程上引發(fā)ThreadAbortException?異常。ThreadAbortExcetion是一個(gè)可以被應(yīng)用程序捕獲的特殊異常,在catch 塊中會(huì)自動(dòng)重新拋出這個(gè)異常,除非在catch塊中調(diào)用ResetAbort方法。ResetAbort方法可以取消掉終止的請(qǐng)求,而且可以防止catch中再次拋出的ThreadAbortException終止當(dāng)前線(xiàn)程。未執(zhí)行的Finally塊會(huì)在線(xiàn)程終止前執(zhí)行。

回到頂部

二、Thread.Abort的用法

例子:

?

名稱(chēng)

代碼

計(jì)算限制的

操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

public?class?ThreadWork

{

????public?static?void?DoWork()

????{

????????try

????????{

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

????????????{

????????????????Tool.WriteMessage("Thread - working.", ConsoleColor.Green, ConsoleColor.White);

????????????????Thread.Sleep(1000);

????????????}

????????}

????????catch?(ThreadAbortException e)

????????{

????????????Tool.WriteMessage("Thread - Caught ThreadAbortException - resetting.", ConsoleColor.Green, ConsoleColor.White);

????????????Tool.WriteMessage("Thread - Exception message: "?+ e.Message, ConsoleColor.Red, ConsoleColor.White);

?????????????

????????????/*--如果調(diào)用Thread.ResetAbort()-----

????????????1.取消終止線(xiàn)程的請(qǐng)求,并恢復(fù)線(xiàn)程,繼續(xù)執(zhí)行ResetAbort后面的語(yǔ)句,然后執(zhí)行catch塊之后的語(yǔ)句

????????????2.若Catch塊之后有Finally塊,則執(zhí)行Finally塊,然后執(zhí)行Finally塊后面的語(yǔ)句。

????????????*/

????????????/*----如果沒(méi)有調(diào)用Thread.ResetAbort()----

????????????1.finally塊在線(xiàn)程終止前執(zhí)行,finally塊之后的語(yǔ)句不會(huì)被執(zhí)行,然后線(xiàn)程終止。

????????????*/

????????????//Thread.ResetAbort();

????????????//Tool.WriteMessage("Thread - ResetAbort", ConsoleColor.Green, ConsoleColor.White);

????????}

????????finally

????????{

????????????Tool.WriteMessage("Thread - Finally blocks were executed.", ConsoleColor.Green, ConsoleColor.White);

????????}

????????Tool.WriteMessage("Thread - still alive and working.", ConsoleColor.Green, ConsoleColor.White);

????????Thread.Sleep(1000);

????????Tool.WriteMessage("Thread - finished working.", ConsoleColor.Green, ConsoleColor.White);

????}

}

主程序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public?class?ThreadAbortTest

{

????public?static?void?Main()

????{

????????try

????????{

????????????ThreadStart myThreadDelegate =?new?ThreadStart(ThreadWork.DoWork);

????????????Thread myThread =?new?Thread(myThreadDelegate);

????????????myThread.Start();//啟動(dòng)線(xiàn)程myThread,執(zhí)行DoWork方法

????????????Thread.Sleep(100);

????????????Tool.WriteMessage("Main - aborting my thread.", ConsoleColor.Blue, ConsoleColor.White);

????????????myThread.Abort();//終止線(xiàn)程myThread

????????????myThread.Join();//等待線(xiàn)程myThread結(jié)束

????????????Tool.WriteMessage("Main - ending.", ConsoleColor.White, ConsoleColor.White);

????????}

????????catch(Exception ex)

????????{

????????????throw?ex;

????????}

????????Console.ReadKey();

????}

}

工具類(lèi)

1

2

3

4

5

6

7

8

9

public?static?class?Tool

{

????public?static?void?WriteMessage(string?message, ConsoleColor writeColor ,ConsoleColor backColor)

????{

????????Console.ForegroundColor = writeColor;

????????Console.WriteLine(message);

????????Console.ForegroundColor = backColor;

????}

}

?

(1)調(diào)用Thread.Abort()的輸出結(jié)果:

?

(2)未調(diào)用Thread.Abort()輸出結(jié)果:

?

(3)流程:

(1)當(dāng)主線(xiàn)程調(diào)用myThread.Abort()后,線(xiàn)程myThread拋出異常,線(xiàn)程myThread捕獲到異常

(2)在myThread catch塊中

如果調(diào)用Thread.ResetAbort()-----

???? Step1.取消終止線(xiàn)程的請(qǐng)求,并恢復(fù)線(xiàn)程,繼續(xù)執(zhí)行ResetAbort后面的語(yǔ)句,然后執(zhí)行catch塊之后的語(yǔ)句

???? Step2.若catch塊之后有Finally塊,則執(zhí)行執(zhí)行Finally塊,然后執(zhí)行Finally塊后面的語(yǔ)句。

?如果沒(méi)有調(diào)用Thread.ResetAbort()----

????? 1.finally塊在線(xiàn)程終止前執(zhí)行,finally塊之后的語(yǔ)句不會(huì)被執(zhí)行,然后線(xiàn)程終止。

?

回到頂部

三、無(wú)法終止線(xiàn)程的情形

當(dāng)調(diào)用線(xiàn)程的Abort方法時(shí),不能保證線(xiàn)程立即終止,有可能永遠(yuǎn)不能終止。這種情形發(fā)生在catch或finally塊中存在長(zhǎng)時(shí)間或無(wú)限的耗時(shí)操作時(shí)。

只有當(dāng)catch或finally塊中代碼執(zhí)行完才能終止線(xiàn)程。所以我們可以調(diào)用線(xiàn)程的Join方法來(lái)等待線(xiàn)程的完成或終止。

回到頂部

四、Catch塊中拋出異常

應(yīng)用程序?qū)?huì)被終止,Finally塊不會(huì)被執(zhí)行

?

回到頂部

五、Finally塊中拋出異常

應(yīng)用程序?qū)?huì)被終止

?

回到頂部

六、Abort調(diào)用的時(shí)間

(1)線(xiàn)程Start之前調(diào)用Abort

線(xiàn)程會(huì)在Start被調(diào)用時(shí)終止線(xiàn)程。

(2)線(xiàn)程Sleeping的時(shí)候調(diào)用Abort

線(xiàn)程被中斷,然后終止線(xiàn)程

(3)線(xiàn)程Blocked的時(shí)候調(diào)用Abort

線(xiàn)程被中斷,然后終止線(xiàn)程

(4)線(xiàn)程被掛起的時(shí)候調(diào)用Abort

Throw ThreadStartException 引發(fā)Abort的調(diào)用,然后AbortRequested 被加到正在被終止的線(xiàn)程的ThreadState屬性

(5)一個(gè)托管線(xiàn)程正在執(zhí)行非托管代碼時(shí)調(diào)用Abort

ThreadAbortException不會(huì)被拋出直到線(xiàn)程返回托管代碼。

(6)如果同時(shí)Abort兩個(gè)線(xiàn)程,有可能一個(gè)線(xiàn)程會(huì)設(shè)置狀態(tài)信息,而另外一個(gè)線(xiàn)程執(zhí)行Abort的方法。然而,應(yīng)用程序不會(huì)檢測(cè)到這種情形。

?


作  者:?Jackson0714?
出  處:http://www.cnblogs.com/jackson0714/?
關(guān)于作者:專(zhuān)注于微軟平臺(tái)的項(xiàng)目開(kāi)發(fā)。如有問(wèn)題或建議,請(qǐng)多多賜教!?
版權(quán)聲明:本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接。?
特此聲明:所有評(píng)論和私信都會(huì)在第一時(shí)間回復(fù)。也歡迎園子的大大們指正錯(cuò)誤,共同進(jìn)步。或者直接私信我?
聲援博主:如果您覺(jué)得文章對(duì)您有幫助,可以點(diǎn)擊文章右下角【推薦】一下。您的鼓勵(lì)是作者堅(jiān)持原創(chuàng)和持續(xù)寫(xiě)作的最大動(dòng)力!?

總結(jié)

以上是生活随笔為你收集整理的C#多线程之旅(七)——终止线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。