我在 SO 上看到很多 Q/As 说使用 EF 进行多线程处理可能很困难。
我遇到的情况是 Web API 在数据库中排队作业。Windows 服务(目前实际上是一个控制台应用程序)获取这些作业,在多个线程上运行它们并将结果存储在数据库中。
我目前正在使用存储库模式,最初尝试仅使用主线程来更新数据库。这不起作用,因为工作的进入速度(比主线程更新数据库的速度要快得多)——尤其是在有很多结果(数万)的情况下。
下一种方法是转到每个线程的上下文,我可以通过更改容器上的生命周期管理器来轻松完成,但这(可能)会导致并发问题,其中工作线程将作业状态更新为“完成”但主线程不知道,因为它的缓存副本仍在“进行中”。
我想下一个方法是每个请求都有上下文,但我担心会有很多设置/拆卸 - 特别是有很多线程并排运行。无论如何,我会试一试,看看它有多好/多坏。
假设最后一个选项是要走的路,我怎样才能让 Unity 解决相同的上下文请求?也就是说,如果我这样做...
Dim UnitOfWork = Container.Resolve(Of IUnitOfWork)
Dim UserRepo = Container.Resolve(Of IUserRepository)
Dim RoleRepo = Container.Resolve(Of IRoleRepository)
''Do Stuff
UnitOfWork.Commit
我需要所有对象使用相同的上下文。我是否需要推出自己的终身经理并为每个组使用独特的东西(比如新的 Guid)
Dim Key = Guid.NewGuid
Dim UnitOfWork = Container.Resolve(Of IUnitOfWork)(New MyLifetimeManager(Key))
Dim UserRepo = Container.Resolve(Of IUserRepository)(New MyLifetimeManager(Key))
或者,还有更好的方法?