【发布时间】:2013-05-27 14:19:02
【问题描述】:
在我目前正在构建的系统中,我必须向提供计算服务的 API 发出网络请求。该服务需要一组复杂的参数,我必须从我的数据库中检索这些参数。目前我正在使用实体框架来检索这些实体,并且对于每个实体我都向这个 api 发出请求,检索结果并最后将所有结果保存到数据库中(一切都是同步完成的)
当实体集增加时,这种方法会出现扩展问题(因为我必须每 30 分钟对每个实体调用一次计算服务)。因此,我想对一个实体进行并行(或异步)的数据库检索和 Web 请求,并对其他实体进行相同的操作。 (不是为了减少数据加载时间,而是在等待网络请求完成的同时工作)
由于 EF 5 上下文不是线程安全的,我最好的替代方案是什么?我应该编写特定的 SQL 查询、使用 LINQ 等吗?有没有人有类似方法的代码示例(并行 webrequest 的数据库检索)
编辑 添加一个小代码示例(非常简化)。假设对 Web 服务的调用可能需要几秒钟,这将无法扩展。
foreach(entityId in entityIds)
{
var entity = _repository.Find(entityId);
_repository.LoadData(entity);
_validator.ValidateData(entity);
var result = _webservice.Call(entity);
entity.State = result.State;
}
_repository.SaveChanges();
【问题讨论】:
-
您仍然可以在调用数据库时对 Web 服务进行异步调用。或在必要时使用 Task.Run 调用数据库。你能提供一些你想做的代码吗?
-
添加了一个小样本。
-
也可以使用 SaveAsync() 方法...
-
嗯.. SaveAsync() 是 EF 6 中即将推出的功能,对吧?
标签: c# entity-framework asynchronous httpwebrequest task-parallel-library