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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET:如何让线程支持超时?

發(fā)布時(shí)間:2023/12/18 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET:如何让线程支持超时? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

背景

本文是為了回復(fù)博客園一個(gè)兄弟的問題,主要回答兩個(gè)問題:

  • 如何讓線程支持超時(shí)?
  • 如何讓線程在執(zhí)行結(jié)束后銷毀?
  • MS 現(xiàn)在不推薦使用低級(jí)別的 Thread 編程,而推薦使用 Task,另外我多數(shù)情況都是做企業(yè)應(yīng)用,很少需要多線程編程的場(chǎng)景,本文中的知識(shí)都是從 《clr via c#》學(xué)習(xí)而來。

    如何讓線程支持超時(shí)?

    使用?CancellationTokenSource

    代碼

    1 private static void TimeoutTest1() 2 { 3 var cts = new CancellationTokenSource(); 4 5 var thread = new Thread(() => 6 { 7 Console.WriteLine(String.Format("線程{0}執(zhí)行中", Thread.CurrentThread.ManagedThreadId)); 8 Thread.Sleep(10000); 9 Console.WriteLine(String.Format("線程{0}執(zhí)行中", Thread.CurrentThread.ManagedThreadId)); 10 }); 11 12 cts.Token.Register(() => 13 { 14 thread.Abort(); 15 }); 16 cts.CancelAfter(1000); 17 18 thread.Start(); 19 thread.Join(); 20 21 Console.WriteLine(String.Format("線程{0}的狀態(tài):{1}", thread.ManagedThreadId, thread.ThreadState)); 22 }

    輸出

    備注

    這里采用了 Abort 終止了線程,CancellationTokenSource 也支持其它模式,可以去官方看看文檔。

    使用?Join

    代碼

    1 private static void TimeoutTest2() 2 { 3 var thread = new Thread(() => 4 { 5 Console.WriteLine(String.Format("線程{0}執(zhí)行中", Thread.CurrentThread.ManagedThreadId)); 6 Thread.Sleep(10000); 7 Console.WriteLine(String.Format("線程{0}執(zhí)行中", Thread.CurrentThread.ManagedThreadId)); 8 }); 9 10 thread.Start(); 11 thread.Join(1000); 12 thread.Abort(); 13 14 Console.WriteLine(String.Format("線程{0}的狀態(tài):{1}", thread.ManagedThreadId, thread.ThreadState)); 15 }

    輸出

    基于 Task 的實(shí)現(xiàn)

    代碼

    1 private static void TimeoutTest3() 2 { 3 var cts = new CancellationTokenSource(); 4 var task = new Task(() => 5 { 6 while (true) 7 { 8 cts.Token.ThrowIfCancellationRequested(); 9 10 Console.WriteLine("xxxxxx"); 11 Thread.Sleep(1000); 12 } 13 }, cts.Token); 14 15 task.Start(); 16 17 cts.CancelAfter(5000); 18 19 Console.ReadLine(); 20 }

    輸出

    如何讓線程在執(zhí)行結(jié)束后銷毀?

    線程執(zhí)行完、遇到未處理異常和被終止后就自動(dòng)不可用了,如果是垃圾,自然會(huì)被 GC 給回收,有一點(diǎn)需要說明的是:線程的未處理異常會(huì)導(dǎo)致應(yīng)用程序的終止,一個(gè)線程的異常不會(huì)自動(dòng)冒泡到其它線程。

    備注

    我學(xué)習(xí)多線程知識(shí)感覺到的一個(gè)好處就是:讓我對(duì)數(shù)據(jù)庫并發(fā)有了更深刻的認(rèn)識(shí)了,找個(gè)機(jī)會(huì)寫寫線程的樂觀鎖和數(shù)據(jù)庫的樂觀鎖的比較,思路基本一樣。

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/happyframework/p/3440877.html

    總結(jié)

    以上是生活随笔為你收集整理的.NET:如何让线程支持超时?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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