一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程( 三 )

{ var data = https://www.isolves.com/it/cxkf/bk/2021-12-01/db.Companies.ToList; data.Insert(0, new Company { Id = 0, Name = "-" }); return data.ToArray; } });}作为替代方案,我们可以使用方法ContinueWith,该方法可以应用于任务,并且可以在上一个方法完成后立即指定要运行的新任务:
[Route("resources")]public Task <Resource> GetResources{ using (var db = new AppDbContext(this.optionsBuilder.Options)) { return db.Resources.ToListAsync .ContinueWith(dataTask = > { var data = https://www.isolves.com/it/cxkf/bk/2021-12-01/dataTask.Result; dataTask.Result.Insert(0, new Resource { Id = 0, Name = "-" }); return data.ToArray; }); }}我们可以让编译器执行“垃圾代码”,并使用关键字async和await,这可以为我们创建Task:
[Route("areas")]public async Task <Area> GetAreas{ using (var db = new AppDbContext(this.optionsBuilder.Options)) { var data = https://www.isolves.com/it/cxkf/bk/2021-12-01/await db.Areas.ToListAsync; data.Insert(0, new Area { Id = 0, Name = "-" }); return data.ToArray; }}正如您在最后一种方法中看到的那样,代码更加简单,并且向我们隐藏了Task的创建,从而使我们可以异步返回 。让我们想象一下一个场景,其中调用不止一个,并且这种方法如何使一切变得更加线性 。
重构的作用是方法GetAreas已成为异步操作 。这个事实意味着,当不同的请求到达此API时,分配给该请求的线程池的线程将被释放以供其他请求使用,直到DbContext终止数据提取为止 。
我希望我能引起您足够的兴趣来深入分析该论点 。在许多情况下,使用async和await非常方便,并且除了使代码更加简洁和线性外,还可以提高一般应用程序的性能 。
示例代码见:
https://github.com/fvastarella/Programmazione-asincrona-con-async-await
 
References[1]https:


推荐阅读