aKz*_*enT 5 .net c# architecture multithreading entity-framework
我有以下场景:
我有一个数据库存储由服务器捕获和处理的作业.通过实体框架访问数据库.
服务器使用多个线程并行处理作业.为此,我有一个线程,它定期检查数据库中的新作业并将它们分发给工作线程.
我现在的问题是我的实体有一个Progress属性,应该由工作线程更新并定期写入数据库.
工作线程经常更新属性(每秒多次),但是对于我的要求,如果数据库每隔几秒更新就足够了,我不想对数据库进行许多不必要的更新.
到目前为止,我的解决方案是让工作线程直接将进度写入实体,并让检查更新的线程也将这些更改发布到数据库.
我的问题是:从EF的角度来看,这个线程是否安全.我可以从一个线程更新实体的属性,并将更改写入另一个线程上的数据库吗?我是否需要锁定?请记住,我只在一个线程中使用DataContext(最少添加,因为我不知道在更新(非POCO)实体时EF在内部做了什么.
现在的另一个要求是我需要在工作进程中从数据库加载其他数据.我假设我必须为此使用单独的DataContexts,我真的不喜欢在同一个线程中管理来自两个独立数据上下文的实体.
你有什么建议如何以一种很好的方式构建它?
由于每个worker只更新一个Job-Entity的状态,因此一个想法是将进程公开为worker-threads类中的属性,该属性由主线程获取,然后主线程将更新实体并将更新发布到数据库.但是我仍然需要工作线程中的原始Job-Entity来读取配置数据,如果我将它重新连接到工作线程的DataContext,我就不能再在主线程中使用Entity了.如果不是真的有必要,我想避免加载同一个实体2次......
是否可以自动复制实体,在2个单独的DataContexts中使用它?
谢谢你的任何想法!
最后我做出了以下决定:
我的主类/主线程从数据库中读取作业并将其分发给各个工作线程。对于每个作业,都有一个相应的作业执行器,其 .Execute() 方法由工作线程运行。
按照惯例,执行器类在构造作业实体时从作业实体读取所有必要的配置数据,并且在执行期间不允许再接触它。由于Executor类的构造是从主线程完成的,所以这里不存在多线程访问。
更改状态(例如作业的进度)通过执行器类上的属性公开,并定期从主线程同步到实体/数据库。
工作线程也有自己的 DataContext 来在必要时加载附加数据。
对 DataContext 的所有其他多线程访问都与锁同步。