异步编程-编程指南
此文仅为学习笔记,详见:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/
1、封装常规异步方法:方法以Async结尾,并且加上修饰符asyn,方法中用await调用异步方法,返回类型:void、Task 、Task<TResult>
private async Task SumPageSizesAsync() { HttpClient client = new HttpClient() { MaxResponseContentBufferSize = 1000000 }; byte[] urlContents = await client.GetByteArrayAsync(url); DisplayResults(url, urlContents); }
2、程序运行机制:调用异步方法时,会开启异步线程进行调用,后面的方法在注线程中继续执行;方法中await为异步运行标记点,在该点上,直到等待的异步操作完成后方法才能继续执行
// 1.通常任务被创建后即等待
var result = await someWebAccessMethodAsync(url);
// 2.先异步并行再等待 var myTask = someWebAccessMethodAsync(url); // . . . . . var result = await myTask;
3、Task类的应用:借助Task来实现异步方法
// 匿名方法
await Task.Run(() => { Thread.Sleep(2000);});
// Task.WhenAll应用于任务集合,所有任务都完成时完成
Task<int>[] downloadTasks = downloadTasksQuery.ToArray();
int[] lengths = await Task.WhenAll(downloadTasks);
// 获取某一完成任务
Task finished = await Task.WhenAny(allTasks);
4、任务的取消
CancellationTokenSource cts=new CancellationTokenSource(); // 与任务绑定 await AccessTheWebAsync(cts.Token) // 显式取消 if (cts != null) { cts.Cancel(); } // 延迟取消 cts.CancelAfter(2500); // 完成一个任务后取消其它任务 Task<int> firstFinishedTask = await Task.WhenAny(downloadTasks); cts.Cancel();
5、使用异步进行文件访问