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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NET问答: 如何取消或中止 Task 执行 ?

發(fā)布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET问答: 如何取消或中止 Task 执行 ? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

咨詢區(qū)

  • Patrice Pezillier

我在一個線程里創(chuàng)建了若干了task并開啟執(zhí)行,當我在業(yè)務邏輯中執(zhí)行了 Thread.Abort() 之后,我發(fā)現(xiàn)這些 Task 并沒有被終止掉?

問題來了,我如何將 Abort() 傳遞到內部的 Task 呢?

回答區(qū)

  • Darin Dimitrov

你做不到的,Task默認就依托于底層線程池中的線程,同時用 Thread.Abort() 來中止線程也是不推薦的,在 Task 中推薦的做法是使用 cancellation tokens,可參考如下代碼:

class?Program {static?void?Main(){var?ts?=?new?CancellationTokenSource();CancellationToken?ct?=?ts.Token;Task.Factory.StartNew(()?=>{while?(true){//?do?some?heavy?work?hereThread.Sleep(100);if?(ct.IsCancellationRequested){//?another?thread?decided?to?cancelConsole.WriteLine("task?canceled");break;}}},?ct);//?Simulate?waiting?3s?for?the?task?to?completeThread.Sleep(3000);//?Can't?wait?anymore?=>?cancel?this?task?ts.Cancel();Console.ReadLine();} }
  • Florian Rappl

之所以在中止Thread后Task沒有被終止的原因在于:你在Task中沒有捕獲到當前的 Thread ,如果做到了這點,那就可以完美解決了,參考如下代碼:

void?Main() {Thread?thread?=?null;Task?t?=?Task.Run(()?=>?{//Capture?the?threadthread?=?Thread.CurrentThread;//Simulate?work?(usually?from?3rd?party?code)Thread.Sleep(1000);//If?you?comment?out?thread.Abort(),?then?this?will?be?displayedConsole.WriteLine("Task?finished!");});//This?is?needed?in?the?example?to?avoid?thread?being?still?NULLThread.Sleep(10);//Cancel?the?task?by?aborting?the?threadthread.Abort(); }

點評區(qū)

其實這是大家用多線程開發(fā)必然會遇到的一個問題,對 CancellationToken 的理解和運用還是非常重要的。

總結

以上是生活随笔為你收集整理的NET问答: 如何取消或中止 Task 执行 ?的全部內容,希望文章能夠幫你解決所遇到的問題。

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