用下面的代码验证了 CancellationTokenSource 可以当作一种更简单的定时器使用
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.ProcessExit +=
(object sender, EventArgs e) => Console.WriteLine($"Exited at {DateTime.Now}");
Console.WriteLine($"Running at {DateTime.Now}");
var cts = new CancellationTokenSource();
cts.CancelAfter(5000);
void Cancel()
{
Console.WriteLine($"Cancelled at {DateTime.Now}");
}
cts.Token.Register(Cancel);
Thread.Sleep(10000);
}
}
输出如下:
$ dotnet run
Running at 4/27/2019 2:37:07 PM
Cancelled at 4/27/2019 2:37:12 PM
Exited at 4/27/2019 2:37:17 PM
CancellationTokenSource 的 callback 定时器用的是 System.Threading.TimerQueueTimer
callback 方法中不能抛异常,所抛异常无法被捕获,从而引发 Unhandled Exception
可以手动取消异步任务执行
从开始.NET Framework 4,.NET Framework 使用统一的模型来协作取消异步操作或长时间运行的同步操作涉及两个对象:
一个CancellationTokenSource对象,它提供取消标记通过其Token属性,并将取消消息通过调用其Cancel或CancelAfter方法。
一个CancellationToken对象,指示是否请求取消。
用于实现协作取消模型的常规模式是:
实例化 CancellationTokenSource 对象,此对象管理取消通知并将其发送给单个取消标记。
将 CancellationTokenSource.Token 属性返回的标记传递给每个侦听取消的任务或线程。
调用CancellationToken.IsCancellationRequested从接收取消标记的操作的方法。 提供有关每个任务或线程来响应取消请求的机制。 无论你选择取消操作和完全操作方式,取决于你的应用程序逻辑。
调用 CancellationTokenSource.Cancel 方法以提供取消通知。 这将设置CancellationToken.IsCancellationRequested到取消标记的每个副本上的属性true。
调用Dispose方法在您使用完CancellationTokenSource对象。
有关详细信息,请参阅托管线程中的取消。