1. 程式人生 > 其它 >C#協作試取消執行緒

C#協作試取消執行緒

https://segmentfault.com/q/1010000017109927

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace 取消執行緒池中執行緒 { class Program { static void Main(string[] args) { Console.WriteLine( "主執行緒執行" ); CancellationTokenSource cts = new CancellationTokenSource( ); //ThreadPool.QueueUserWorkItem(CallBack, cts.Token ); ThreadPool.QueueUserWorkItem(CallBack, cts); Console.WriteLine( "按下回車鍵取消啟動的執行緒" ); Console.Read( ); cts.Cancel(); Console.ReadKey(); } public static void CallBack( object state ) { CancellationTokenSource cts = (CancellationTokenSource)state; Console.WriteLine( "開始計數" ); Count( cts, 5 ); } private static void Count(CancellationTokenSource cts, int countto ) { for( int i=0; i<=countto+10; ++i) { if( i== countto) { cts.Cancel(); Console.WriteLine( "計算取消" ); //return; } Console.WriteLine( "計算為:{0}, 當前執行緒ID: {1}", i, Thread.CurrentThread.ManagedThreadId ); Thread.Sleep(300); } Console.WriteLine("計數完成"); } } }

很明顯在呼叫cts.Cancel()後Count()函式還在執行,看到書上說CancellationTokenSource是協助式取消執行緒,剛學多執行緒,很多不明白的。
我們將一些任務(函式)放在某一個執行緒中執行,如果任務終止是不是就代表執行緒取消了
上述程式碼如果改為:

if( i== countto) {
    cts.Cancel();
    Console.WriteLine( "計算取消" );
    return;
}

這樣是不是就可以正確的取消執行緒。

c# 回覆 閱讀838
1個回答
得票數最新 佳佳
  • 57
釋出於2018-12-12

Count方法中需要使用cts.IsCancellationRequested來判斷當前執行緒是否已經被取消。

if (cts.IsCancellationRequested)
{
    Console.WriteLine( "計算取消" );
    return;
}
回覆