NET问答: 如何取消或中止 Task 执行 ?
生活随笔
收集整理的這篇文章主要介紹了
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 执行 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Masuit.Tools,一个免费的轮子
- 下一篇: 程序有并发错误?NO WAY!