使用数据库检索叠加异步webrequest

时间:2013-05-27 14:19:02

标签: c# entity-framework asynchronous httpwebrequest task-parallel-library

在我正在构建的系统中,我必须向提供计算服务的API进行webrequests。此服务需要一组复杂的参数,我必须从我的数据库中检索这些参数。目前我正在使用实体框架来检索这些实体,并且我正在向每个实体请求此api,检索结果,最后将所有结果保存到数据库(所有内容同步完成)

当实体集增加时,这种方法会出现扩展问题(因为我必须每30分钟在每个实体上调用计算服务)。因此,我想对parallell(或async)中的实体进行数据库检索和Web请求,并对其他实体执行相同的操作。 (不是为了减少数据加载的时间,而是在等待webrequest完成时继续工作)

由于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();

2 个答案:

答案 0 :(得分:1)

您可以做的是使用生产者 - 消费者体系结构:一个线程访问数据库并将数据添加到BlockingCollection之类的内容中。另一个线程(或多个线程)从集合中读取数据并执行Web请求。

答案 1 :(得分:0)

您可以通过不同的方式对其进行并行化。这完全取决于你真正想要/需要的东西。

一种方法是使用Paralle.ForEach

Parallel.ForEach(
    entityIds,
    entityId =>
    {
        var entity = _repository.Find(entityId);
        _repository.LoadData(entity);
        _validator.ValidateData(entity);
        var result = _webservice.Call(entity);
        entity.State = result.State;
    });

_repository.SaveChanges();