C# 定期从EF中的多个线程更新实体

C# 定期从EF中的多个线程更新实体,c#,.net,multithreading,entity-framework,architecture,C#,.net,Multithreading,Entity Framework,Architecture,我有以下情况: 我有一个数据库,存储由服务器捕获和处理的作业。通过实体框架访问数据库 服务器使用多个线程并行处理作业。为此,我有一个线程定期检查数据库中的新作业,并将它们分发给工作线程 我现在的问题是,我的实体有一个Progress属性,它应该由工作线程更新并定期写入数据库 工作线程经常更新属性(每秒多次),但对于我的要求,如果数据库每隔几秒钟更新一次就足够了,我不想对数据库进行许多不必要的更新 到目前为止,我的解决方案是让工作线程直接将进度写入实体,让检查更新的线程也向数据库发出这些更改 我的

我有以下情况:

我有一个数据库,存储由服务器捕获和处理的作业。通过实体框架访问数据库

服务器使用多个线程并行处理作业。为此,我有一个线程定期检查数据库中的新作业,并将它们分发给工作线程

我现在的问题是,我的实体有一个Progress属性,它应该由工作线程更新并定期写入数据库

工作线程经常更新属性(每秒多次),但对于我的要求,如果数据库每隔几秒钟更新一次就足够了,我不想对数据库进行许多不必要的更新

到目前为止,我的解决方案是让工作线程直接将进度写入实体,让检查更新的线程也向数据库发出这些更改

我的问题是:从EF的角度来看,这个线程是安全的吗。我是否可以从一个线程更新实体的属性,并将更改写入另一个线程上的数据库?我需要锁箱吗?请记住,我只在一个线程中使用DataContext(最少显式添加),因为我不知道更新(非POCO)实体时EF在内部做什么

现在的另一个要求是,我需要在工作进程中从数据库加载额外的数据。我假设我必须为此使用单独的DataContext,并且我不喜欢在同一线程中管理来自两个单独数据上下文的实体

你有什么建议如何以一种好的方式来组织它吗

由于每个worker只更新一个作业实体的状态,一个想法是将进度作为worker threads类中的属性公开,该类由主线程获取,然后主线程将更新实体并向数据库发出更新。但我仍然需要worker线程中的原始作业实体来读取配置数据nd如果我将其重新附加到工作线程的DataContext,我将无法在主线程中再使用该实体。如果没有必要,我希望避免加载同一实体2次

是否可以自动复制一个实体,以便在两个单独的数据上下文中使用它


谢谢你的建议!我认为你应该重新设计一下你的系统

您遇到了麻烦,因为实体的进度存储在实体中


如果您将它分开,这样您就有一个包含所有作业进度的表/上下文。每个线程都可以更新它,并且可以使用计时器定期将其保存到数据库中。

最后,我做出了以下决定:

我的主类/主线程从数据库读取作业,并将它们分发给各个工作线程。对于每个作业,都有一个相应的作业执行器,其.Execute()方法由工作线程运行

按照惯例,Executor类在构建作业实体时从该作业实体读取所有必要的配置数据,并且在执行期间不允许再接触它。由于Executor类的构建是从主线程完成的,因此这里没有多线程访问

更改状态(如作业的进度)通过executor类上的属性公开,并定期从主线程同步到实体/数据库

工作线程还具有自己的DataContext,以便在必要时加载其他数据


所有其他对DataContext的多线程访问都与锁同步。

你能详细说明一下吗?我真的不知道这是如何解决问题的。如果每个线程都更新新的“进度”实体,并且主线程定期保存该实体,这基本上与我目前的设计相同,只是我有一个单独的表(每次查询工作等时,我都必须包含)…如果你不懂线程,那么你真的会让你自己和你软件的用户陷入很多麻烦。使用线程有几十种方法,有些方法比其他方法更容易理解。我只是提醒你不要用这样一个高层次的主题来回答你自己的问题。你应该展示一些代码和d来回地进行一个小对话,这样你就可以找到问题的正确解决方案。