NET问答: 如何取消或中止 Task 执行 ?
生活随笔
收集整理的這篇文章主要介紹了
NET问答: 如何取消或中止 Task 执行 ?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
咨詢區(qū)
Patrice Pezillier:
我在一個(gè)線程里創(chuàng)建了若干了task并開啟執(zhí)行,當(dāng)我在業(yè)務(wù)邏輯中執(zhí)行了 Thread.Abort() 之后,我發(fā)現(xiàn)這些 Task 并沒有被終止掉?
問題來了,我如何將 Abort() 傳遞到內(nèi)部的 Task 呢?
回答區(qū)
Darin Dimitrov:
你做不到的,Task默認(rèn)就依托于底層線程池中的線程,同時(shí)用 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中沒有捕獲到當(dāng)前的 Thread ,如果做到了這點(diǎn),那就可以完美解決了,參考如下代碼:
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(); }點(diǎn)評區(qū)
其實(shí)這是大家用多線程開發(fā)必然會(huì)遇到的一個(gè)問題,對 CancellationToken 的理解和運(yùn)用還是非常重要的。
總結(jié)
以上是生活随笔為你收集整理的NET问答: 如何取消或中止 Task 执行 ?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Masuit.Tools,一个免费的轮子
- 下一篇: 程序有并发错误?NO WAY!