image.png
1、调用Sleep延时取消
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var t1 = Task.Run(() =>
{
uint icount = 0;
while (!cts.IsCancellationRequested)
{
Console.WriteLine($"子线程t1正在运行,ID为:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
icount++;
}
return $"执行了{icount}次";
},cts.Token);
//注册一个线程取消后执行的逻辑
cts.Token.Register(() =>
{
//线程取消后执行的逻辑
Console.WriteLine($"线程被取消了{t1.Result}");
});
Thread.Sleep(2000);
cts.Cancel();
//Console.WriteLine("t1 return value:"+t1.Result);
Console.WriteLine("main thread end");
Console.ReadLine();
}
2、延时写法cts.CancelAfter(2000);
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var t1 = Task.Run(() =>
{
uint icount = 0;
while (!cts.IsCancellationRequested)
{
Console.WriteLine($"子线程t1正在运行,ID为:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
icount++;
}
return $"执行了{icount}次";
},cts.Token);
//注册一个线程取消后执行的逻辑
cts.Token.Register(() =>
{
//线程取消后执行的逻辑
Console.WriteLine($"线程被取消了{t1.Result}");
});
cts.CancelAfter(2000);
//Console.WriteLine("t1 return value:"+t1.Result);
Console.WriteLine("main thread end");
Console.ReadLine();
}
3、不需要调用Cancel或CancelAfter
static void Main(string[] args)
{
var cts = new CancellationTokenSource(2000);
var t1 = Task.Run(() =>
{
uint icount = 0;
while (!cts.IsCancellationRequested)
{
Console.WriteLine($"子线程t1正在运行,ID为:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
icount++;
}
return $"执行了{icount}次";
},cts.Token);
//注册一个线程取消后执行的逻辑
cts.Token.Register(() =>
{
//线程取消后执行的逻辑
Console.WriteLine($"线程被取消了{t1.Result}");
});
//Console.WriteLine("t1 return value:"+t1.Result);
Console.WriteLine("main thread end");
Console.ReadLine();
}
4、线程的组合取消,组合中的任意一个取消,组合就取消
static void Main(string[] args)
{
var cts1 = new CancellationTokenSource();
var cts2 = new CancellationTokenSource();
var combineCts = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token);
var t1 = Task.Run(() =>
{
uint icount = 0;
while (!combineCts.IsCancellationRequested)
{
Console.WriteLine($"子线程t1正在运行,ID为:{Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(100);
icount++;
}
return $"执行了{icount}次";
}, combineCts.Token);
//注册一个线程取消后执行的逻辑
combineCts.Token.Register(() =>
{
//线程取消后执行的逻辑
Console.WriteLine($"线程被取消了{t1.Result}");
});
Thread.Sleep(1000);
cts1.Cancel();
Console.WriteLine($"cts1={cts1.IsCancellationRequested} " +
$"cts2={cts2.IsCancellationRequested} " +
$"combineCts={combineCts.IsCancellationRequested}");
Console.WriteLine("main thread end");
Console.ReadLine();
}
image.png