轻度解析异步~Task.Delay

1.暂停一段时间

public static Task ShortDelay(TimeSpan delay)
{
    await Task.Delay(delay);
    Console.WriteLine(string.Format("延迟{0}", delay));
}

解析:

  • 异步编程使用async与await关键字,搭配返回Task或其泛型
  • async的存在是为了代码中await的生效
  • 如果没有返回值,更推荐写为Task,而不是void
  • Task.Delay()是异步编程提供的延迟方法,如果你想延迟两秒,可以Task.Delay(2000);
  • 当Task.Delay(delay);执行后,会异步延迟delay的时间,在延迟的同时,执行下方的Console
  • 当这行代码前+await,会等待异步延迟的执行结束后,执行下方的Console

2.实现简单的指数退避策略

pulic static async Task ToDoRetries()
{
    var nextDelay = TimeSpan.FromSeconds(1);
    for(int i = 0; i<3; i++)
    {
        return await DoSometingAsync();

        nextDelay += nextDelay;
        await Task.Delay(nextDelat);
    }
}

解析:

  • 退避策略:防止被访问的频繁被阻塞

3.实现超时处理

private static async Task<string> ToDoAsync()
{
    await Task.Delay(TimeSpan.FromSeconds(3));
    return "To Do Success!";
}

public static async Task<string> ToDoWithTimeOut()
{
    var toDoTask = ToDoAsync();
    var timeOutTask = Task.Delay(TimeSpan.FormSeconds(3));

    var completedTask = await Task.WhenAny(toDoTask, timeOutTask);
    if(completedTask == timeOutTask)
    {
        return "";
    }
    return await toDoTask;
}

解析:

  • Task.WhenAny(toDoTask, timeOutTask);是只要其中有一个异步,或者说是任务完成,就返回
  • 最费解就是最后最后一行,toDoTask是一个Task,并不是异步方法,为什么前面还有await,当将await去掉后:
    这里写图片描述
    断点后发现,toDoTask是一个Task类型,其中有id,status等属性,如果在Task类型前+await,获取的是Task类型中Result属性的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值