【发布时间】:2019-06-25 21:52:26
【问题描述】:
我正在开发一个 OData 端点以从数据库中返回项目列表。
我返回一个IQueryable 并让前端通过 odata 查询选项处理查询/过滤/扩展/分页。
考虑以下方法:
[ODataRoute]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IActionResult Get() {
return Ok(context.Vendors.AsQueryable());
}
我知道async 并不是真正需要的,因为这里没有具体化查询。
在这种情况下,查询何时具体化?
它是以异步方式完成的吗?
【问题讨论】:
-
一个方法只有在异步时才是异步的。当访问端点时,查询被物化(在中间件中),因此异步确实很重要。
-
对,在每个 odata rest api 示例中,我发现这是调用它的正确方法。但是,我们建立了一个小型测试营地,并且有大约 30 个并发用户报告了速度缓慢,cpu 和内存使用量飙升......我想知道这些 API 调用是否是原因,我的理论是资源没有被正确释放,不断堆积......
-
这些是不同的问题。 async/await 仅有助于线程管理,以便线程不会阻塞 IO 调用。 Async/Await 对内存/资源/cpu 使用没有影响。如果资源没有被释放,那么您需要检查您是如何注册实现 IDisposable 的类型并确保它们不会留下来的。例如,DbContext 类型应注册为
InstancePerLifetimeScope(如果您使用扩展名,则为默认值)。 -
但是,如果您在测试环境和数据库中分析您的应用程序以了解实际发生的情况,您会取得更大的进步。
-
是的,我会这样做并回帖!
标签: c# asp.net-core entity-framework-core odata