【问题标题】:Long running stateful service in .NET.NET 中长时间运行的有状态服务
【发布时间】:2010-03-11 16:56:58
【问题描述】:

我需要在 .NET 中创建一个服务,该服务在内存中维护(内部)状态,产生多个线程并且通常是长时间运行的。有很多选择 -

  • 老旧的 Windows 服务
  • Windows 通信服务
  • Windows 工作流基础

我真的不知道该选哪个。大部分功能都在此服务使用的库中,因此服务本身相当简单。

一方面,服务主机尽可能接近“简单工作”非常重要,这不包括 Windows 服务。另一方面,重要的是服务不会因为没有外部活动而被主机取消,这使得 WCF 有点“可怕”。至于 WF,它最大的卖点是能够将流程创建为,嗯...,工作流,这是我不需要也不想要的东西。

总而言之,过多的微软技术让我有点困惑。

对于每个解决方案(或我未提及的其他解决方案)的优缺点,我很感激帮助解决 .NET 中的有状态、长时间运行的服务问题

谢谢,
阿萨夫

附:
我正在使用 .NET 4。

编辑:

  • 我所说的主机“简单工作”是指,例如,我创建的服务在崩溃时会重新激活。
  • 我想这个问题的原因是我过去创建了 Windows 服务(我认为它是用 Win32 API 用纯 C++ 编写的),如果有的话,我不想错过更简单的东西作为事物。

感谢迄今为止的所有回复!
阿萨夫。

编辑 2:

我将使用 Windows 服务,并可能在其中托管 WCF 服务以允许其他进程与之通信。

谢谢,
阿萨夫

【问题讨论】:

  • 这是一个很好的问题,+1 和收藏
  • 如果您还没有尝试在 .NET 中创建 Windows 服务,我建议您尝试一下。它实际上并不比控制台应用程序复杂多少,并且有很多方法可以处理重启和信号。

标签: .net workflow .net-4.0 wcf


【解决方案1】:

根据您的描述,您最好的选择是#1,一个好的旧 Windows 服务。您可以为它分配工作,它可以运行任意时间,并且它可以产生线程。不确定您所说的“简单工作”是什么意思,或者为什么这会使 Windows 服务无法运行。

您也可以制作一个简单的控制台应用程序,但您必须自己处理管理(重启等)。

WCF 本质上是通过 Web 进行的 .NET 远程处理,它本身不处理长时间运行的进程。 Workflow Foundation 可以处理长时间运行的工作流,但仅此而已。

【讨论】:

    【解决方案2】:

    根据您的要求“内存中的(内部)状态,产生多个线程并且通常长时间运行”实际上有两种选择:

    1. 控制台应用程序
    2. Windows 服务

    提到的其他两个是这些的衍生物。第一个太原始了,让我们忘记这一点。但为了便于调试,我建议在Main 中检查Environment.UserInteractive,如果真的作为控制台应用程序运行,则作为服务运行。所以你的选择应该是第二个。

    WCF 是通信框架,与长时间运行的服务无关。 IIS 可以托管 WCF 应用程序,但那里没有多线程和内存数据,它是作为 Web 服务的单一调用。 WF 是工作流框架,同样与服务无关。它可以帮助实现复杂的流程逻辑。

    WCF 和 WF 都可以在 Windows 服务中使用。

    【讨论】:

      【解决方案3】:

      由于您似乎不需要任何与工作流相关的功能,因此我投票支持 WCF 中的持久服务。这是 .NET 3.5 中的新功能,它允许 WCF 服务将其状态持久化到基于提供程序的“持久性存储”中,通常是 SQL Server 后端数据库(但也有一个基于文件系统的提供程序,它是可扩展的 - 你可以编写如果需要,您自己的)。

      查看有关此主题的一些优秀博客文章:

      WCF 是一个强大而强大的通信库,它可以让您摆脱在从头开始创建所有这些时必须处理的大量麻烦和细节。

      WCF 可以托管在 IIS 中(有其所有缺陷),或者您可以将 WCF 服务粘贴到 Windows NT 服务中,让它在机器启动时启动并运行,无需任何人登录。

      【讨论】:

      • 您的第一个链接显示“WCF 持久服务是 WCF 服务,其中操作可以在服务主机和/或客户端重新启动之间记住私有变量的值(=服务的状态)。” ,这很有趣,但不是我需要的。我确实学到了一些新东西。谢谢!
      【解决方案4】:

      我会推荐好的 ol windows 服务。为了这些目的,我已经使用 C# 编写了许多服务。它们可以产生线程,运行永恒,并且经过精心设计,可以做你想做的事。您可以直接在 Visual Studio 中创建 .net windows 服务。它是 .net 项目类型之一。

      WCS 和 WCF 都会做你想做的事,但需要一些额外的工作,而且真的不是为你想做的事而设计的。

      【讨论】:

        【解决方案5】:
        1. 尽可能“简单地工作” - 不包括 Windows 服务...
        2. 由于不活动而未删除...可怕 - WCF...
        3. 不需要工作流,也不需要它 - Workflow Foundation...

        似乎没有你想相信的那么多选择! ;P

        • 一个简单的 EXE 执行这项工作,并通过 Windows 任务计划程序进行计划?您从应用程序内部管理多线程。这就像控制台应用程序一样简单。

        编辑我的第一选择也是 Windows 服务,但通过调度程序更简单。

        【讨论】:

          【解决方案6】:

          也许看看Quartz.Net?它更像是一个调度程序,但您可以在多个线程上启动作业等。我使用它而不是 Windows 服务取得了巨大成功。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-22
            • 2014-03-13
            • 1970-01-01
            • 2020-11-20
            • 2020-01-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多