• 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#并发编程经典实例

  • 相关阅读:
    unity3d 启用某层设置
    Unity同 iOS,Android数据交互
    Unity发布EXE去掉边框生成安装程序的最简单方法
    判断物体相对自己的方位
    相机Culling Mask 用法
    LitJson 用法
    Unity3d Attribute 总结
    unity3d shader 预定义着色器预处理宏
    (转)傅里叶分析 变换等
    Shaders: ShaderLab & Fixed Function shaders
  • 原文地址:https://www.cnblogs.com/darrenji/p/4711348.html
Copyright © 2020-2023  润新知