在ASP.NET API中对存储库方法进行同时并行调用

xxls0lw8  于 2022-11-26  发布在  .NET
关注(0)|答案(2)|浏览(129)

在我的ASP.NET核心API中,我需要对3个不同的存储库进行3次单独的调用,以便收集做出决策所需的所有数据。
我想尽可能地节省时间,以便加快速度。使用常规调用方法或并行调用方法完成所有3个调用所需的时间有什么区别吗?
常规方式为:

var customer = await _customersRepository.GetCustomer(customerId);

var balance = await _salesRepository.GetCustomerBalance(customerId);

var product = await _productsRepository.GetProduct(productId);

我以前没有使用过并行方法,但我认为它是这样的:

Customer customer;
Balance balance;
Product product;

Parallel.Invoke(
   () =>
   {
      customer = await _customerRepository.GetCustomer(customerId);
   },
   () => 
   {
      balance = await _salesRepository.GetCustomerBalance(customerId);
   },
   () => 
   {
      product = await _productRepository.GetProduct(productid);
   });

同样,我主要关心的是尽快完成所有三个存储库/数据库调用,以便获得做出决策所需的所有数据。
1.运行并行任务是否有利于保存时间?
1.使用并行调用方法还有其他好处或问题吗?

jv4diomz

jv4diomz1#

如果您可以构造一个对数据库的 * 单个 * 查询,一次检索所有数据,那就更好了。
但如果必须执行多个并发数据库调用,则可以使用Task.WhenAll(注意:而不是Parallel)。您必须确保您的仓库使用 * 不同 * 的数据库上下文,因为EF上下文不支持并发:

var customerTask = _customersRepository.GetCustomer(customerId);
var balanceTask = _salesRepository.GetCustomerBalance(customerId);
var productTask = _productsRepository.GetProduct(productId);

await Task.WhenAll(customerTask, balanceTask, productTask);

var customer = await customerTask;
var balance = await balanceTask;
var product = await productTask;
icnyk63a

icnyk63a2#

根据存储库操作所花费的时间,并行执行这些操作可能会有好处。但是,DbContext不是线程安全的,因此请确保为每次执行检索单独的示例(假设它们从DbContext读取)。另外,请查看此线程以了解有关EF Core并行执行的更多信息:What is the best practice in EF Core for using parallel async calls with an Injected DbContext?

相关问题