首页 > 其他分享 >异步任务取消、超时

异步任务取消、超时

时间:2024-06-19 09:13:13浏览次数:27  
标签:异步 Console 取消 token ex WriteLine 超时 TaskAsync

一、定义异步任务

//定义异步任务
public class AsyncClass
{
    public static async Task TaskAsync(CancellationToken token)
    {
        token.Register(() => { Console.WriteLine("TaskAsync被取消"); });

        for (int i = 0; i < 10; i++)
        {
            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
            await Task.Delay(1000);
            Console.WriteLine($"TaskAsync:{i}");
        }
    }

    public static async Task TaskAsync1(CancellationToken token)
    {
        token.Register(() => { Console.WriteLine("TaskAsync1 is Cancel"); });

        for (int i = 0; i < 10; i++)
        {
            if (token.IsCancellationRequested)
            {
                token.ThrowIfCancellationRequested();
            }
            await Task.Delay(1000);
            Console.WriteLine($"TaskAsync1:{i}");
        }
    }
}

二、实现异步任务取消

#region 取消
var cts = new CancellationTokenSource();
try
{
    var token = cts.Token;

    token.Register(() => { Console.WriteLine("Main 被取消"); });//当前线程取消提示

    cts.CancelAfter(3000);//3秒后取消

    //cts.Cancel();

     await AsyncClass.TaskAsync(token);
}
catch (OperationCanceledException ex)
{
    Console.WriteLine(ex.ToString());
}
catch (TimeoutException ex)
{
    Console.WriteLine(ex.ToString());
}
finally
{
    cts.Dispose();
}
#endregion

三、实现异步任务超时

#region 超时

var TimeOutCts = new CancellationTokenSource();
try
{
    var TimeOutToken = TimeOutCts.Token;
    //方式一
    //var mytask = AsyncClass.TaskAsync(TimeOutToken);
    //var completedTask = await Task.WhenAny(mytask, Task.Delay(2000, TimeOutToken));
    //if (completedTask != mytask)
    //{
    //    throw new TimeoutException("TaskAsync超时了");//手动抛出超时异常
    //}

    //方式二
    await AsyncClass.TaskAsync1(TimeOutToken).WaitAsync(TimeSpan.FromMilliseconds(2000));

}
catch (TimeoutException ex) 
{
    TimeOutCts.Cancel();//捕获超时异常,取消任务
    Console.WriteLine(ex.ToString());
}
catch (OperationCanceledException ex)
{
    Console.WriteLine(ex.ToString());
}
finally
{
    TimeOutCts.Dispose();
}
#endregion

四、运行结果

 

标签:异步,Console,取消,token,ex,WriteLine,超时,TaskAsync
From: https://www.cnblogs.com/daiwk/p/18255458

相关文章

  • Nginx下载大文件超时配置和请求超时配置等
    https://blog.csdn.net/weixin_42949219/article/details/139354348 Nginx下载大文件超时配置和请求超时配置等location/download{......proxy_bufferingoff; proxy_connect_timeout180s; proxy_send_timeout180s; proxy_read_timeout180s; proxy_se......
  • 单相异步电动机的建模仿真(3)基于空间向量和混合磁链数学模型
    目录1.引言2.混合磁链数学模型3.基于混合磁链数学模型的Simulink仿真模型4.空间向量数学模型5.基于空间矢量数学模型的Simulink仿真模型6.仿真实例7.总结1.引言    不同的数学模型形式可以提供不同的视角和分析方法,这对于电机的设计、控制和故障诊断......
  • go语言之异步并发
    1.首先讲一下匿名函数和闭包的概念,(仔细看,其实Python代码里很好看,只不过Go语言代码有点多,看起来很复杂的感觉)packagemainimport"fmt"funcmain(){/*注意:匿名函数和闭包往往是一起出现的*///不带参的匿名函数func(){fmt.Printf("不带参数的匿名......
  • 爬虫 | 异步请求aiohttp模块
    aiohttp模块,也就是asynciohttp操作#1.创建一个对象aioreq=aiohttp.ClientSession()>>>即对应异步的requests#2.用这个异步requests来发送请求resp=aioreq.get(url)#3.异步写入文件,用到aiofiles模块,pip安装,可学习:https://www.w3cschool.cn/article/86236403.h......
  • Flask 的异步用法案例
    Flask的异步用法案例。案例1:异步视图异步视图允许你使用asyncdef定义路由处理函数,这在处理I/O密集型任务时非常有用。fromflaskimportFlaskimportasyncioapp=Flask(__name__)@app.route('/async-data')asyncdefget_async_data():#模拟异步操作,例如......
  • 批量异步上传aws图片脚本(python)
    背景工作中需要上传一些测试图片,于是网上找找资料(官方说明),前置步骤如下。python需要3.8以上,安装最新的boto3库:pipinstallboto3有一个S3权限的aws账户,得到访问密钥ACCESS_KEY与SECRET_KEY,以及上传图片的存储桶位置安装异步编程asyncio,aiohttp库,方便本地异步上传图片代码......
  • 游戏缓存与异步持久化的完美邂逅
    1、问题提出游戏服务器,需要频繁的读取玩家数据,同时也需求频发修改玩家数据,并持久化到数据库。为了提高游戏服务器的性能,我们应该怎么处理呢?2、应用程序缓存缓存,是指应用程序从数据库读取完数据之后,就将数据缓存在进程内存或第三方内存(例如redis)。游戏服务器对于玩家数据的读......
  • C# .NET Framework 4.0 异步
    .NETFramework4.0只能用Task.Factory.StartNew()4.0以上的则可以直接使用Task.Run()。Task.Factory.StartNew(()=>{})usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;usingMicrosoft.VisualStudio.TestTools.UnitTesting;namespacecom._80comm......
  • Es6中promise的解释用法以及何为同步异步、回调函数和回调地狱?
    一.什么是回调函数?        1.含义                ★回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在特定事件或条件发生时被调用执行。        2.回调函数在编程中扮演着重要的角色,主要用于以下场景:            ......
  • 校园网自动认证+取消设备限制
    前言针对西航xaau1网络实现,按道理对其他的校园网也可以实现工具:1,电脑,任意有开发者工具的浏览器(edge,chrome都可以)2,路由器(自动认证非必要,取消设备上限必要)Windows步骤第一步,校园网认证界面抓包1.连接校园网2.电脑打开认证界面键盘按下F12如图右上角设置,如果是英文则......