.net 6 async await 取消Task任务

发布时间 2023-11-25 18:29:53作者: Simian_2018_12_22

引言

在用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();
}

在控制器中.net会自动注入CancellationToken,只需要直接用就可以,取消的时机为浏览器关闭或者用户不再访问当前页面时。