异步编程-编程指南

此文仅为学习笔记,详见: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、使用异步进行文件访问

 

posted @ 2020-03-11 16:27  雄鹰低飞  阅读(120)  评论(0编辑  收藏  举报