1.暂停一段时间
public static Task ShortDelay(TimeSpan delay)
{
await Task.Delay(delay);
Console.WriteLine(string.Format("延迟{0}", delay));
}
解析:
- 异步编程使用async与await关键字,搭配返回Task或其泛型
- async的存在是为了代码中await的生效
- 如果没有返回值,更推荐写为Task,而不是void
- Task.Delay()是异步编程提供的延迟方法,如果你想延迟两秒,可以Task.Delay(2000);
- 当Task.Delay(delay);执行后,会异步延迟delay的时间,在延迟的同时,执行下方的Console
- 当这行代码前+await,会等待异步延迟的执行结束后,执行下方的Console
2.实现简单的指数退避策略
pulic static async Task ToDoRetries()
{
var nextDelay = TimeSpan.FromSeconds(1);
for(int i = 0; i<3; i++)
{
return await DoSometingAsync();
nextDelay += nextDelay;
await Task.Delay(nextDelat);
}
}
解析:
- 退避策略:防止被访问的频繁被阻塞
3.实现超时处理
private static async Task<string> ToDoAsync()
{
await Task.Delay(TimeSpan.FromSeconds(3));
return "To Do Success!";
}
public static async Task<string> ToDoWithTimeOut()
{
var toDoTask = ToDoAsync();
var timeOutTask = Task.Delay(TimeSpan.FormSeconds(3));
var completedTask = await Task.WhenAny(toDoTask, timeOutTask);
if(completedTask == timeOutTask)
{
return "";
}
return await toDoTask;
}
解析:
- Task.WhenAny(toDoTask, timeOutTask);是只要其中有一个异步,或者说是任务完成,就返回
- 最费解就是最后最后一行,toDoTask是一个Task,并不是异步方法,为什么前面还有await,当将await去掉后:
断点后发现,toDoTask是一个Task类型,其中有id,status等属性,如果在Task类型前+await,获取的是Task类型中Result属性的值