Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源
2015-08-07 17:05
239 查看
如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法。
比如,在单元测试中模拟一个异步操作。
又比如,当我们需要远程下载内容,由于远程服务器的状态未必稳定,如果只调用某个方法一次,未必能获取到想要的数据。
我们可以每隔一段时间调用方法一次,向远程服务器获取内容,比如第一次等待1秒,第二次等待2秒,第三次等待4秒,最后再尝试一次。也就是限次获取远程内容。
也可以限时获取远程内容。比如限时在3秒内获取远程资源,如果3秒内没有获取到就返回null。
参考资料:C#并发编程经典实例
比如,在单元测试中模拟一个异步操作。
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#并发编程经典实例
相关文章推荐
- uboot ping doesn’t work
- iOS 根据字符串样式、字符串长度计算字符串所占大小
- 博客园山寨版(asp.net mvc 开源)
- JavaScript Hack set/get
- Tomcat源码阅读三:过滤器实现
- JAVA实现EXCEL行列号解析(二)——多格解析
- C++的输入输出
- Mysql学习第1天
- 如何实现TWaver 3D颜色渐变
- Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画
- 2015 Multi-University Training Contest 5 hdu 5352 MZL's City
- “The constructor SimpleCursorAdapter(Context, int, Cursor, String[], int[]) is deprecated”
- 8.7日星期五ios开发群
- OC-字符串常用操作(NSString、NSMutableString)
- HDOJ 1686 POJ 3461 Oulipo kmp
- UILable
- 手机设备连接eclipse的问题
- 规则引擎快速导出jsp页面实现计算器
- Codeforces 538 E. Demiurges Play Again
- linux mysql errorcode 29