如果想让程序异步等待一段时间,可以考虑使用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. 统一过程模型(RUP/UP)

    http://blog.sina.com.cn/s/blog_6a06f1b7010121hz.html 统一过程(RUP/UP,Rational Unified Process)是一种以用例驱动.以 ...

  2. Ubuntu下SSH安装

    step: 1.输入命令: sudo apt-get install openssh-server 2.验证sshserver是否启动了,以下两条命令均可 ps -e | grep ssh netst ...

  3. laravel 打印sql语句

    public function getCurrencyOrder($user_id=70,$pid=252,$register=['register:first']) { DB::connection ...

  4. SqlServer中Sql查看存储过程

    ( 一)利用Sql语句查询数据库中的所有表 1.利用sysobjects系统表 select * from sysobjects where xtype='U'  2,利用sys.tables目录视图 ...

  5. 方法调用---springMVC中调用controller的方法

    我们有一个路由StudentController,里面有一个方法count().如果要在另外一个GradeController中调用count()方法有2种方式: 因为StudentControlle ...

  6. Intellij IDEA Debug调试技巧

    1.这里以一个web工程为例,点击图中按钮开始运行web工程. 2.设置断点 3.使用postman发送http请求 4.请求发送之后会自动跳到断点处,并且在断点之前会有数据结果显示 5.按F8 在 ...

  7. JavaScript中变量的相互引用

    http://www.jb51.net/article/23387.htm  

  8. qString转char*

    char *vi_name = new char[vi_rsc_name.length()]; strcpy(vi_name,vi_rsc_name.toStdString().data()); de ...

  9. 【AtCoder】ARC090

    C - Candies 前一枚举一个i,求第一行的前i个和第二行从第n个到第i个 代码 #include <bits/stdc++.h> #define fi first #define ...

  10. streaming优化:禁用序列化

    如果你的streaming处理数据的时间间隔比较小,并且没有窗口操作,那么可以考虑不使用序列化,这样可以减少内存和cpu的使用,加快数据处理效率