标签:
如果想让程序异步等待一段时间,可以考虑使用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);//如果最终的任务等来的是限时任务,那就返回nullif(completedTask == timeoutTask){return null;}return await downloadTask;}}
参考资料:C#并发编程经典实例
Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源
标签:
原文地址:http://www.cnblogs.com/darrenji/p/4711348.html