Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源

 

如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法。

 

比如,在单元测试中模拟一个异步操作

 

 
 
static async Task<T> DelayedResult<T>(T result, TimeSpan delay)
{
    await Task.Delay(delay);
    return result;
}

 

又比如,当我们需要远程下载内容,由于远程服务器的状态未必稳定,如果只调用某个方法一次,未必能获取到想要的数据。

 

我们可以每隔一段时间调用方法一次,向远程服务器获取内容,比如第一次等待1秒,第二次等待2秒,第三次等待4秒,最后再尝试一次。也就是限次获取远程内容

 

 
 
static async Task<string> DownloadFromRemote(string uri)
{
    using(var client = new HttpClient())
    {
        //先等待1秒
        var nextDelay = TimeSpan.FromSeconds(1);
 
 
        //尝试3次,到第3次结束循环
        for(int i = 0; i != 3; i++)
        {
            try
            {
                return await client.GetStringAsync(uri);
            }
            catch(Exception ex)
            {
                throw;
            }
 
 
            await Task.Delay(nextDelay);
            nextDelay = nextDelay + nextDelay;
        }
 
 
        //最后再尝试一次
        return await client.GetStringAsync(uri);
    }
}
 
 
 
 

 

也可以限时获取远程内容。比如限时在3秒内获取远程资源,如果3秒内没有获取到就返回null。

 

 
 
static async Task<string> DonwloadFromRemote(string uri)
{
    using(var client = new HttpClient())
    {
        //从远程获取内容的任务
        var downloadTask = client.GetStringAsync(uri);
 
 
        //限时3秒的任务
        var timeoutTask = Task.Delay(3000);
 
 
        //获取以上2个任务的一种
        var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
 
 
        //如果最终的任务等来的是限时任务,那就返回null
        if(completedTask == timeoutTask)
        {
            return null;
        }
 
 
        return await downloadTask;
    }
}
 
 

 

参考资料:C#并发编程经典实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值