2012-08-13 94 views
4

我有一个.NET 4的Web应用程序,有3个独立的项目相关联 - DAL,BAL和UI。我正在使用实体框架进行数据库交互。不断运行的C#代码 - 服务或单独的线程?

我有一些代码通过一串数据库中的数据的周期,调用方法取决于其发现的,然后更新数据库。我想要这个代码一直运行。同时,我希望用户能够登录并运行报告等,而后台的代码却在不断运行。

这是什么方法?我是否为不断运行的代码创建服务,单独的线程,不断运行的代码的完全独立的项目,还是不同的方法..?

此外,根据给出的答案,我将如何启动不断运行的代码?即通过形式加载方法还是有更好的方法?我目前通过点击开始按钮启动代码;这对于测试是很好的,但在生产时不会起作用。

+0

与论坛网站不同,我们不使用“谢谢”,或“任何帮助表示赞赏”,或在[so]上签名。请参阅“[应该'嗨','谢谢',标语和致敬从帖子中删除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed - 从 - 个)。 – 2012-08-13 14:47:25

+0

如果线程的唯一目的是数据库交互,并且DBMS是SQL Server,那么您可能需要考虑将其实现为[在SQL Server中托管的.NET程序集。](http://msdn.microsoft.com/zh-cn/ us/library/ms254498.aspx) – mbeckish 2012-08-13 14:49:07

+0

@mbeckish OP正在使用**实体框架** - 实体框架在.NET CLR中不受支持。参见[相关SO帖子](http://stackoverflow.com/a/2794127/175679)。它将不得不转换成直接的ADO.NET。 – SliverNinja 2012-08-13 14:53:33

回答

5

对于总是运行的任务,您最适合使用Windows Services

在IIS下一个单独的线程运行的代码是不可靠的机制,因为IIS可以随意终止线程以节省服务器资源。

+2

您也可以将您的服务设置为自动启动。同时确保您的访问代码握手并确保在魔术发生之前启动服务。 – crlanglois 2012-08-13 14:52:42

+0

创建Windows服务是否会影响Web托管选项。假设我想让GoDaddy托管我的应用程序。我可以在他们的网络服务器上安装Windows服务吗? – user1595656 2012-08-13 14:59:15

+0

如果您使用的是GoDaddy,则必须远程托管服务 - 请参阅[相关的GoDaddy论坛帖子](http://support.godaddy.com/groups/web-hosting/forum/topic/scheduled-task-or-窗口服务/)。您应该考虑迁移到[** Windows Azure **](https://www.windowsazure.com/en-us/home/features/cloud-services/)。在Azure下设置Web角色+工作者角色+ SQL数据库将为您解决此问题。 – SliverNinja 2012-08-13 15:11:07

0

使用Windows服务。还应该考虑使用Stored Procs来处理您提到的数据库交互。在关闭Windows服务的方面,您可以将其设置为自动启动(当操作系统启动时),这意味着它将运行直至终止。

0

我只推荐一个Windows服务是否会从字面上始终运行。然而,“总是”通常意味着每x秒/分钟/小时/天。

如果x大于几分钟,我将使它成为控制台应用程序并通过Windows任务计划程序运行它。这样你就不必担心内存泄漏和其他一系列问题。

但是,如果它只与数据库一起工作,我会推荐一个存储过程和一个Sql Job。

2

鉴于其他答案你的问题,并澄清说:

  1. 您的解决方案在托管环境中,你不能安装一个服务运行;
  2. 从第三个服务器(即Azure等)调用它不适合您;

在Application_Start事件中启动一个线程来管理数据库工作可能是最好的。您可能希望确保此线程有一些周期性的空闲时间,以免占用过多的托管环境,并确保在应用程序结束或重新启动时它已关闭。

服务真的是最佳的,但如果你是在托管环境,不能/不会使用另一台服务器,那么这是不可能的。