如果想让程序异步等待一段时间,可以考虑使用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#并发编程经典实例

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

  1. .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法

    前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...

  2. NET4.5中的Task.Run及Task.Delay方法

  3. 15.3 Task Task.Yield和Task.Delay说明

    https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...

  4. Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别

    Task C# 多线程和异步模型 TPL模型   Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...

  5. C# 以函数Action/Func/Task作为方法参数

    以Action.Func.Task作为方法参数,mark一下 以Action为参数 public void TestAction() { //Action参数 ExecuteFunction(() = ...

  6. Task.Delay() 和 Thread.Sleep() 区别

    1.Thread.Sleep 是同步延迟,Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Dela ...

  7. jQuery delay() 方法

    定义和用法 delay() 方法对队列中的下一项的执行设置延迟. 语法 $(selector).delay(speed,queueName) 参数 描述 speed 可选.规定延迟的速度. 可能的值: ...

  8. Task扩展方法取消操作

    /// <summary> /// 任务扩展,传入取消操作 /// </summary> public static class TaskExtensionDemo { //因 ...

  9. task.delay 和 thread.sleep

    1.Thread.Sleep 是同步延迟. Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Del ...

随机推荐

  1. mysql8.0 在window环境下的部署与配置

    今天在阿里云window服务器上配置mysql环境,踩了一些坑,分享出来.需要的朋友可以看看.额,或许有人要吐槽我为什么不在linux上去配置,额,因为我window的那台服务器配置相对高些.本人技术 ...

  2. Mini Twitter

    Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...

  3. 巧用PHP数组函数

    2014年3月5日 08:48:39 情景:项目中需要根据传递来的参数的不同,使用不同的缓存 假如传递来的参数最多有这几个(在这个范围内,但是每次传过来的参数不确定): $arg = array( ' ...

  4. linux:根据名称杀死进程

    参考网址:https://www.cnblogs.com/foohack/p/5359985.html pkill -f "process_name_pattern"

  5. jenkins执行构建任务报错之java.lang.NoSuchFieldError: DEFAULT_USER_SETTINGS_FILE

    在执行创建工作空间时候,创建不成功,出现错误?? ......... java.lang.NoSuchFieldError: DEFAULT_USER_SETTINGS_FILE ......... ...

  6. 可视化并理解CNN

    参考:https://zhuanlan.zhihu.com/p/24833574 学习论文[1311.2901] Visualizing and Understanding Convolutional ...

  7. H5页面调用手机打电话功能

    <head>里面加上: <meta name="format-detection" content="telephone=yes"/> ...

  8. 003_Java笔记3:Eclipse添加jar包

    本文以jedis包为例,演示Eclipse如何添加和使用jar包.   1 建立一个名为ImportJarDemo的Java Project.在该工程下建立一个libs的文件夹. 2 将下载的jedi ...

  9. UI 框架

    Vue.js 之 iView UI 框架 像我们平日里做惯了 Java 或者 .NET 这种后端程序员,对于前端的认识还常常停留在 jQuery 时代,包括其插件在需要时就引用一下,不需要就删除.故观 ...

  10. Yeoman generator

    使用Yeoman generator来规范工程的初始化 前言 随着开发团队不断发展壮大,在人员增加的同时也带来了协作成本的增加:业务项目越来越多,类型也各不相同.常见的类型有基础组件.业务组件.基于R ...