C#協作試取消執行緒
阿新 • • 發佈:2021-06-20
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# 閱讀8381個回答
得票數最新 佳佳- 57
在Count
方法中需要使用cts.IsCancellationRequested
來判斷當前執行緒是否已經被取消。
if (cts.IsCancellationRequested)
{
Console.WriteLine( "計算取消" );
return;
}