【问题标题】:Superimpose async webrequest with database retrieval将异步 Web 请求与数据库检索叠加
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 嗨。抱歉,这可能是一个愚蠢的问题,但是通过使用单线程进行数据检索意味着我可以继续使用 EF 来读取数据吗?如果是这样,我想我也可以使用相同的模式来保存 Web 请求的结果?
  • @user842077 是的,这就是这种方法的重点,您可以继续使用非线程安全的类型。
【解决方案2】:

有不同的方法可以让您并行化。这完全取决于您真正想要/需要什么。

一种方法是使用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();

【讨论】:

  • 实体框架上下文不是线程安全的。因此,我无法并行检索数据。
  • 我不知道这一点。我不是 EF 专家。那么,你打算怎么做呢? entityIds 有多少个 ID?每个实体的大小是多少?一种方法是检索所有实体,然后并行化对 Web 服务的调用。这样可以吗?
  • 我认为 svick 提供的答案是要走的路。另一种方法是放弃 EF 并按照您的方法进行。
  • 放弃 EF 不会让你走得太远,因为我认为你不能使用相同的数据库连接实例。与使用多个 EF 上下文几乎相同。我想知道如果 EF 上下文不跟踪更改,它是否是线程安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多