.net 用于长时间运行windows服务的实体框架体系结构

.net 用于长时间运行windows服务的实体框架体系结构,.net,wcf,web-services,entity-framework,windows-services,.net,Wcf,Web Services,Entity Framework,Windows Services,我有一个问题,如何在windows服务中使用实体框架来优化解决方案的体系结构 我想提供一个在线(网络)服务,允许用户执行可能长时间运行的任务,观察任务的进度,取消任务,等等 到目前为止,我使用一个windows服务来实际执行任务,该任务公开WCF端点,以对新工作进行排队并管理现有任务 我使用实体框架来存储所有作业的历史记录。但是,我不完全确定应该如何对执行作业的后台进程(使用当前进度信息)和公开此状态的wcf服务之间的交互进行建模 我是否应该完全分离这两部分,让后台进程定期将当前状态写入数据库,

我有一个问题,如何在windows服务中使用实体框架来优化解决方案的体系结构

我想提供一个在线(网络)服务,允许用户执行可能长时间运行的任务,观察任务的进度,取消任务,等等

到目前为止,我使用一个windows服务来实际执行任务,该任务公开WCF端点,以对新工作进行排队并管理现有任务

我使用实体框架来存储所有作业的历史记录。但是,我不完全确定应该如何对执行作业的后台进程(使用当前进度信息)和公开此状态的wcf服务之间的交互进行建模

我是否应该完全分离这两部分,让后台进程定期将当前状态写入数据库,然后WCF服务从数据库轮询信息

或者WCF服务直接从访问静态成员或类似对象的后台进程获取信息有意义吗?他们应该共享数据上下文吗

我希望信息是最新的,让后台处理和WCF服务在同一个进程中运行似乎有点奇怪,但是通过数据库进行通信,但另一方面,它似乎是一个更好的架构


非常感谢

我建议将这两部分分开。并将状态保存在数据库中,将来您还可以轻松地将体系结构扩展到多台机器。您的数据库和web客户端访问可以停留在一台服务器上,长时间运行的任务可以停留在多台服务器上


撞坏一个不会影响另一个。您将能够正确地记录信息。如果状态正确保存在数据库中,则可以查看信息并准备执行时间和预测等报告。

我建议将这两部分分开。并将状态保存在数据库中,将来您还可以轻松地将体系结构扩展到多台机器。您的数据库和web客户端访问可以停留在一台服务器上,长时间运行的任务可以停留在多台服务器上


撞坏一个不会影响另一个。您将能够正确地记录信息。如果状态正确保存在数据库中,则可以查看信息并准备执行时间和预测等报告。

一个好的解决方案包括在Web界面和工作人员之间的消息队列(MSMQ、表格等)

Web界面根据需要对消息进行排队并轮询其状态。工作者(可能不止一个)选择消息处理它并更新状态


如果工作进程崩溃,消息应该返回到队列。

一个好的解决方案包括在Web界面和工作进程之间的消息队列(MSMQ、表格等)

Web界面根据需要对消息进行排队并轮询其状态。工作者(可能不止一个)选择消息处理它并更新状态


如果工作进程崩溃,消息应该返回队列。

有意义。在这种情况下,您建议如何在后台进程中使用DataContext?在服务运行时(定期刷新)始终保持它的打开状态似乎不是一个好主意。所以我会使用另一个线程,定期创建DataContext并更新数据库?顺便说一句,我使用SQLite作为数据库,使服务易于部署。目前数据量不应该太高,但如果数据量越来越大,我可以选择切换到SQL Server。除非datacontext内存太大,否则可以长时间保持上下文打开,上下文不会保持与服务器的连接打开,只有在加载或保存更改时,从池中提取新连接以执行操作。长时间保持上下文开放将使您能够更频繁地进行更改,而很少刷新上下文。这是有意义的。在这种情况下,您建议如何在后台进程中使用DataContext?在服务运行时(定期刷新)始终保持它的打开状态似乎不是一个好主意。所以我会使用另一个线程,定期创建DataContext并更新数据库?顺便说一句,我使用SQLite作为数据库,使服务易于部署。目前数据量不应该太高,但如果数据量越来越大,我可以选择切换到SQL Server。除非datacontext内存太大,否则可以长时间保持上下文打开,上下文不会保持与服务器的连接打开,只有在加载或保存更改时,从池中提取新连接以执行操作。长时间保持上下文打开将使您能够更频繁地进行更改,而很少刷新上下文。