1

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

当实体集增加时,这种方法会出现扩展问题(因为我必须每 30 分钟对每个实体调用一次计算服务)。因此,我想以并行(或异步)的方式对实体进行数据库检索和 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();
4

2 回答 2

1

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

于 2013-05-27T16:57:35.677 回答
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();
于 2013-05-28T10:32:32.987 回答