不断运行的C#代码 - 服务还是单独的线程?

时间:2012-08-13 14:45:54

标签: c# html multithreading web-services entity-framework

我有一个.NET 4 Web应用程序,它有3个独立的项目--DAL,BAL和UI。我正在使用Entity Framework进行数据库交互。

我的代码遍历一堆数据库数据,根据找到的内容调用方法,然后更新数据库。我希望这段代码一直运行。同时,我希望用户能够在后台代码不断运行的同时登录并运行报告等。

对此有什么好处?我是否为不断运行的代码,单独的线程,为不断运行的代码完全独立的项目或不同的方法创建服务。?

另外,根据给出的答案,我将如何启动不断运行的代码?即只是通过表格加载方法还是有更好的方法?我目前通过单击开始按钮启动代码;这适用于测试,但在生产时无法正常工作。

4 个答案:

答案 0 :(得分:5)

您最适合将Windows Services用于始终在线的任务

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

答案 1 :(得分:2)

鉴于您的问题和对其他答案的澄清:

  1. 您的解决方案在托管环境中运行,您无法安装服务;
  2. 从第三台服务器(即Azure等)调用它不是您的选择;
  3. 最好在Application_Start事件中启动一个线程来管理数据库工作。您可能希望确保此线程有一些周期性的空闲时间,以免占用过多的托管环境并确保在应用程序结束或重新启动时关闭它。

    服务确实是最佳的,但如果您在托管环境中并且不能/不会使用其他服务器,那么这是不可能的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我只推荐使用Windows服务,如果总是正在运行。但是,“始终”通常表示每x秒/分钟/小时/天。

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

但是,如果只使用数据库,我会推荐一个存储过程和一个Sql Job。

相关问题