首页 > 其他分享 >.net 6 async await 取消Task任务

.net 6 async await 取消Task任务

时间:2023-11-25 18:33:04浏览次数:39  
标签:CancellationToken Task string 取消 await token async

引言

在用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,只需要直接用就可以,取消的时机为浏览器关闭或者用户不再访问当前页面时。

标签:CancellationToken,Task,string,取消,await,token,async
From: https://www.cnblogs.com/sunhouzi/p/17855848.html

相关文章

  • 11.24-task3数据类型
    数据类型与操作基本类型整型int浮点数float布尔值bool(tureorfalse)类型Typetype的use:类型的类型就是类型。。。还有一些更多类型。。。常用内置常数python中是内置了一些常量的-常用内置运算符andornot类似于c语言的&&||!=运算顺序为not>and>......
  • 11.25-task3变量与函数
    变量与函数变量变量是一个名字,用来储存一段数据!变量的值可变化,新值会覆盖之前的值变量相当于一个标签,如a=10,在内存中找一个位置,把地址赋给了a。。命名规则数字不能开头!最好不要用保留字符作为变量名!!!!多变量赋值在进行多变量赋值时,需要将变量之间用,隔开等号右边......
  • 聪明办法学Python Task03&Task04
    数据类型和操作DATATYPESANDOPERATORS常用内置类型在本节将会见到这些基本类型:整数(int):浮点数(float):布尔值(bool):True和False​ 这个比较特殊,是用来表示逻辑上的“真”和“假”(或者说“是”和“非”)的一种类型,它 只有两个值,True和False。(注意:这里没......
  • 【11月LeetCode组队打卡】Task4--BinarySearchTree
    Review有数值有序树:lch<root<rch递归和迭代遍历不同于普通二叉树搜索BST700.二叉搜索树中的搜索有:返回以存储val节点为根的子树无:NULLAC1:递归参数和返回值:根节点&待寻值节点终止条件:根为空||匹配到val单层逻辑:有序树:从左到右搜索......
  • ThreadPoolTaskExecutor类
    ThreadPoolTaskExecutor类可用来创建线程池并添加任务1TreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor();2taskExecutor.setCorePoolSize(5);//设置核心线程数3taskExecutor.setMaxPollSize(10);//设置最大线程数4taskExecutor.setQu......
  • ConfigureAwait in .NET8
    ConfigureAwaitin.NET8ConfigureAwait(true)和ConfigureAwait(false)首先,让我们回顾一下原版ConfigureAwait的语义和历史,它采用了一个名为continueOnCapturedContext的布尔参数。当对任务(Task、Task<T>、ValueTask或ValueTask<T>)执行await操作时,其默认行为是捕获“上......
  • 聪明办法学python(task3and4)
    (直接跳到相应部分查看即可)Python基础输入---print()直接使用print()函数,在括号中加入字符串(可以用双引号也可以用单引号,不能混用)print()也可接受多个字符串,用逗号隔开,遇到逗号输出一个空格输出---input()输出使用input()函数![屏幕截图2023-11-13192454](C:\Users\AS......
  • Python TASK02 :数据类型操作
    #数据类型操作####常用内置类型BUILTINTYPES1.整数Integer(int)2.浮点数Float3.布尔值Boolean(bool)4.类型Type(是的,“类型”也是种类型!)严格的来说,Type是一种类的对象,Python是一门“面向对象友好”的语言 so:print(type(2))--><class'int'>......
  • python-task3:Data Types and Operators
    常见数据类型整数Integer(int)浮点数Float(python中默认为双精度浮点型)布尔值Boolean(bool)类型Type(“类型”也是种类型)其他数据类型字符串String(str)、列表List、元组Tuple、集合Set、字典Dictionary(dict,或者可以叫它映射map)、复数ComplexNumber(complex)、函数Func......
  • python-task4:Variables and Functions
    变量Variables以字母或下划线(_)开头(不可以以数字开头)以字母、数字、下划线组成大小写敏感(A与a不一样)需要避免使用保留字命名,以下代码可查询保留字importkeywordkeyword.kwlist对于变量,旧的值会覆盖新的值,而且python支持多变量赋值a=b=c=2print(f"a={a},b={b},c={c}"......