【问题标题】:which one to use windows services or threading哪一个使用 Windows 服务或线程
【发布时间】:2010-07-26 05:51:38
【问题描述】:

我们正在构建一个使用 asp.net 3.5 和 SQL 服务器作为数据库的 Web 应用程序,该数据库非常大,被大约 300 名超级用户用于管理大约 5000 名员工。 现在我们正在应用程序中实现 SMS 功能,这意味着用户将能够发送和接收 SMS。每两分钟ping一次第三方的短信服务器,检查是否有新消息。短信也排队等待,每隔 15 到 30 分钟发送一次。

我希望这个检查和发送过程一直在应用程序的后台运行,即使用户关闭了浏览器窗口。 我需要一些关于如何执行此操作的建议?

使用线程会实现这一点,还是我需要为它创建一个 Windows 服务,或者还有其他选择吗?


更多信息:

我想在计时器中执行一个任务,如果我关闭浏览器窗口会发生什么,任务不会完成是不是这样。

例如,我以 5 分钟的时间间隔将 10 条记录保存到数据库中,这意味着每 5 分钟触发计时器滴答事件时,将一条记录插入到数据库中。

如果我关闭浏览器窗口,如何运行此任务?

我尝试查看 Windows 服务,但如何将通用数据集合传递给它进行处理。

【问题讨论】:

  • 您希望计时器在服务器上还是在浏览器机器上运行?如果它在服务器上运行,那么关闭浏览器窗口不需要影响服务器上发生的事情。

标签: multithreading architecture windows-services


【解决方案1】:

确实没有线程或服务的选择,一个服务可以(而且通常是!)多线程的,一个线程可以启动一个服务。

您可以选择三个基本选项:-

当用户登录时,以某种方式启动另一个线程运行 - 这可能是您想要的一个非常糟糕的选择,因为一旦用户会话丢失,您就无法真正保持它运行。

编写一个成熟的 Windows 服务,该服务在操作系统启动时启动,并在服务器关闭时继续运行。您可以使其依赖于 SQLserver 服务,因此它会在数据库可用后启动。这是“最佳”解决方案,但对于您的目的来说可能有点过分。此外,您需要了解服务 API 才能正确编写它,因为您需要正确响应关闭和状态请求。

您可以使用 Windows 调度程序定期调度您的任务,或者最好是 SQLServer 内置的调度程序,我认为这将是最适合您需求的选项。

【讨论】:

    【解决方案2】:

    区分浏览器正在做什么和服务器端正在发生什么。

    您的 Web 应用程序正在服务器端等待来自任何可能正在运行的浏览器的请求,并为这些请求提供服务,在为这些请求提供服务时,我猜它可能会将消息放在队列中,并在数据库中查看任何新的消息。

    您希望与第三方 SMS 对话的守护进程处理器由时间触发,而不是由浏览器功能触发。您的任何一个建议都会奏效:

    • 完全独立的服务可以针对队列和数据库运行和工作。
    • 您的网络应用程序(我假设 已经是一项服务)可能会产生一个线程

    在任何一种情况下,我们都有一些技术问题需要避免浏览器请求处理和守护程序之间的任何竞争条件 - 但数据库和排队系统可以解决这个问题。

    所以我会像这样在独立守护程序和后台线程之间做出决定:

    1. 哪个更容易实现?我是一名 Java EE 开发人员,我知道在我的应用服务器中我有一个 API 用于指定要根据计时器运行的代码,该 API 处理线程问题。所以对我来说这很容易。我不知道你有什么可用的。计时器并不像看起来那么简单——因此拥有可靠的 API 是有益的。如果这是一个更复杂的要求,其中守护程序代码很繁琐,并且可能会干扰 WebApp 代码,那么我可能更愿意将其显着地分开。
    2. 哪个更易于部署和管理?部署单独的 Web App 和守护进程,或者部署一个东西。在 Java EE 世界中,我们可以拥有一个包含所有代码的企业应用程序,因此部署、启动和控制都是一件事情。

    要考虑的另一件事:扩​​展和弹性。您可能会选择运行多个 Web 应用程序副本,以提供故障转移功能或仅仅因为您需要额外的功能。在这种情况下,您将拥有多少个守护进程?运行两个守护进程会不会有问题?您可能需要一些额外的代码在两个守护进程之间进行调解,例如登录数据库最后一次工作的时间,每个守护进程可以说“哦,我的伙伴已经完成了 10:30 的工作,我会回去睡觉”

    【讨论】:

    • 感谢您的回复,我想让我的问题更清楚。我想在计时器中执行一个任务,如果我关闭浏览器窗口会发生什么,任务不会完成不是这样。例如,我以 5 分钟的时间间隔将 10 条记录保存到数据库中,这意味着每 5 分钟触发一次计时器滴答事件,就会将一条记录插入到数据库中。如果我关闭浏览器窗口,如何运行此任务。我尝试查看 Windows 服务,但如何将通用数据集合传递给它进行处理。请给我一些关于如何做到这一点的见解。
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多