引言
在用await执行方法时,方法有时候会执行特别长时间,在执行过程中想中断方法,需要使用到CancellationToken类。
控制台程序中取消Task任务
一、 创建一个执行需要很长时间的方法
static async Task DownloadAsync(string url, int n,
CancellationToken cancellationToken)
{
using (HttpClient client = new HttpClient())
{
for (int i = 0; i < n; i++)
{
string html = await client.GetStringAsync(url);
Console.WriteLine($"{DateTime.Now}:{html}");
// 判断请求是否被取消,如果被取消则直接取消请求
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("请求取消");
break;
}
}
}
}
cancellationToken.IsCancellationRequested
返回的是一个bool值,表示当前Task任务有没有被取消。
也可以使用cancellationToken.ThrowIfCancellationRequested()
这个方法表示如果Task任务被取消了的话,直接抛出一个异常。调用的函数需要处理这个异常
如果调用的.net内部函数可以传递CancellationToken的话就在调用时将CancellationToken传递给内部函数,防止内部函数执行的时间过长,导致定时取消不准确。
二、在调用时传递CancellationToken用来取消Task任务
定时取消任务:
static async Task Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
// 执行方法超过2000毫秒的时候取消执行此方法
cts.CancelAfter(2000);
CancellationToken token = cts.Token;
await DownloadAsync("https://www.baidu.com", 50, token);
}
自定义条件取消任务
static void Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
DownloadAsync("https://www.baidu.com", 50, token);
while (Console.ReadLine() != "q")
{
}
cts.Cancel();
Console.ReadLine();
}
在web网页中取消Task任务
一、耗时的方法
static async Task DownloadAsync(string url, int n,
CancellationToken cancellationToken)
{
using (HttpClient client = new HttpClient())
{
for (int i = 0; i < n; i++)
{
string html = await client.GetStringAsync(url);
Debug.WriteLine($"{DateTime.Now}:{html}");
//判断请求是否被取消,如果被取消则直接取消请求
if (cancellationToken.IsCancellationRequested)
{
Debug.WriteLine("请求取消");
break;
}
}
}
}
二、浏览器关闭时,取消Task任务
public async Task<IActionResult> Index(CancellationToken token)
{
await Downloa1dAsync("https://www.baidu.com", 5000, token);
return View();
}
标签:CancellationToken,Task,string,取消,await,token,async From: https://www.cnblogs.com/sunhouzi/p/17855848.html在控制器中.net会自动注入CancellationToken,只需要直接用就可以,取消的时机为浏览器关闭或者用户不再访问当前页面时。