{
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:
推荐阅读
- 一文看懂“超融合”和“虚拟化”的区别
- 爷青回!经典老牌音乐播放器Winamp宣布回归
- IOS技术分享|WebRTC iOS源码下载&编译
- 一张图看懂私域流量的底层逻辑
- 详解Python软件安装教程和配置,小白都能看懂的教程,值得收藏
- 一文告诉你USB4和雷雳4到底是什么
- 百度SEO搜索引擎优化为什么会提倡"白帽"拒绝"黑帽"
- 看懂IPv6+,这篇就够了
- 不要让爱你的觉得不值?我的爱对你来说一文不值
- 微信朋友圈使用"提醒谁看"时,别人能看到吗?