【问题标题】:C# code that run constantly - service or separate thread?不断运行的 C# 代码 - 服务还是单独的线程?
【发布时间】:2012-08-09 19:44:56
【问题描述】:

我有一个 .NET 4 Web 应用程序,它关联了 3 个独立的项目——DAL、BAL 和 UI。我正在使用实体框架进行数据库交互。

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

对此有什么好的方法?我是为不断运行的代码创建一个服务、一个单独的线程、为不断运行的代码创建一个完全独立的项目,还是另一种方法..?

另外,根据给出的答案,我将如何启动不断运行的代码?即仅通过表单加载方法还是有更好的方法?我目前通过单击开始按钮来启动代码;这对于测试来说很好,但在生产中就不行了。

【问题讨论】:

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


【解决方案1】:

您最适合将Windows Services 用于始终运行的任务

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

【讨论】:

  • 您也可以将服务设置为自动启动。还要确保您的访问代码握手并确保服务在魔法发生之前启动。
  • 创建 Windows 服务是否会影响 Web 托管选项。假设我希望 GoDaddy 托管我的应用程序。我可以在他们的网络服务器上安装 Windows 服务吗?
  • 如果您使用 GoDaddy,则必须远程托管服务 - 请参阅 related GoDaddy forum post。您应该考虑迁移到Windows Azure。在 Azure 下设置 Web 角色 + 工作者角色 + SQL DB 将为您解决这个问题。
  • Windows Azure 现在不是一个选项。如果可能的话,我想要一个适用于我目前所拥有的解决方案。
  • 为了获得可靠的行为,您必须远程运行 Windows 服务或切换到 GoDaddy physical/virtual dedicated servers 以获得对远程计算机的管理员级别访问权限并安装您的服务。
【解决方案2】:

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

  1. 您的解决方案在您无法安装服务的托管环境中运行;
  2. 从第三个服务器(即 Azure 等)调用它不是您的选择;

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我只会推荐一个 Windows 服务,如果它确实会始终运行。但是,“总是”通常意味着每 x 秒/分钟/小时/天。

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 2014-02-22
        • 2021-06-09
        • 2011-11-17
        • 1970-01-01
        相关资源
        最近更新 更多