替代将DbContext对象传递给并行任务

问题描述 投票:1回答:2

我有一个场景涉及对电子邮件列表执行相同的处理操作。为了加快处理速度,我正在寻找在我的邮件集合上使用Parallel.ForEach。循环创建我的邮件项处理(clsMailItemProcess)类的实例,并将邮件项传递给它并处理它。

处理每个邮件项的规则包含在数据库模式中,这样可以更轻松地配置规则。在电子邮件中有许多规则来标识参考号,每个规则都有许多可能的方法来识别号码。任务循环执行规则,然后根据首先匹配的规则处理电子邮件。

我正在寻找一些关于使用DbContext的最佳方法的帮助。

  • 我应该在Parallel.ForEach之外创建它,然后传递对clsMailItemProcess类的引用吗?从我正在阅读的内容中,这可能会导致问题,因为DbContext不是线程安全的,这可以解释我在极少数情况下看到的错误,尽管它在95%的情况下都没有问题。我假设(可能是错误的,我是EF新手)这会减少数据库调用)
  • 我应该在clsMailItemProcess类中创建一个新的DbContext并在其中使用它吗?这会增加对数据库的调用
  • 我应该创建DbContext并将其规则转换为对象,然后我可以根据需要传递给我的应用程序

我应该指出我的DbContext不会改变,也不会将更改写回数据库。

c# entity-framework parallel-processing dbcontext
2个回答
1
投票

鉴于:

我应该指出我的DbContext不会改变,也不会将更改写回数据库。

然后:

我应该创建DbContext并将其规则转换为对象,然后我可以根据需要传递给我的应用程序

是。去做。


0
投票

我会在Parallel.ForEach调用中获得一个新的DbContext。将上下文传递给多个线程可能会有问题,特别是如果您的规则在污染上下文方面存在某种类型的副作用。

你确定这需要并行完成吗?在我的一些宠物项目中,我需要解决类似的工人问题。我会有一个类来轮询集合的变化。当类看到它有工作要做时,它会用它的新工作负载触发clsMailItemProcess。

这将有助于减少复杂性(好吧,它应该),以及让我隔离我的clsMailItemProcess代码。

© www.soinside.com 2019 - 2024. All rights reserved.