.net NET中长期运行的有状态服务

.net NET中长期运行的有状态服务,.net,workflow,.net-4.0,wcf,.net,Workflow,.net 4.0,Wcf,我需要在.NET中创建一个服务,该服务在内存中维护(内部)状态,生成多个线程,并且通常是长期运行的。有很多选择- 好的旧Windows服务 Windows通信服务 Windows工作流基金会 我真的不知道该选哪一个。大部分功能都在该服务使用的库中,因此该服务本身相当简单 一方面,重要的是服务主机尽可能地“简单工作”,这不包括Windows服务。另一方面,很重要的一点是,服务不会因为没有外部活动而被主机关闭,这让WCF有点“恐怖”。至于WF,它最大的卖点是能够将流程创建为工作流,这是我不需要也

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

  • 好的旧Windows服务
  • Windows通信服务
  • Windows工作流基金会
我真的不知道该选哪一个。大部分功能都在该服务使用的库中,因此该服务本身相当简单

一方面,重要的是服务主机尽可能地“简单工作”,这不包括Windows服务。另一方面,很重要的一点是,服务不会因为没有外部活动而被主机关闭,这让WCF有点“恐怖”。至于WF,它最大的卖点是能够将流程创建为工作流,这是我不需要也不想要的

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

对于.NET中有状态、长时间运行的服务的问题,我希望您能帮助我了解每种解决方案(或我没有提到的其他解决方案)的优缺点

谢谢,
阿萨夫

另外,
我正在使用.NET4

编辑:

  • 例如,我所说的主机“简单工作”的意思是,如果我创建的服务崩溃,它将被重新激活 我猜这个问题的原因是我过去创建了Windows服务(我认为它是用C++语言编写的Win32 API),如果有这样的事情,我不想错过更简单的东西。
感谢所有到目前为止的回复
阿萨夫

编辑2:

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

谢谢,

Asaf

根据您的描述,您的最佳选择是#1,一个很好的旧Windows服务。您可以将工作分配给它,它可以运行任意时间,并且可以生成线程。不知道你们所说的“简单工作”是什么意思,也不知道为什么这会使Windows服务停止运行

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

WCF本质上是通过web进行的.NET远程处理,它本身不处理长时间运行的进程。工作流基础可以处理长时间运行的工作流,但仅限于此。
  • 尽可能“简单地工作”——这不包括Windows服务
  • 由于不活动而未被取下。。。可怕的-WCF
  • 不需要工作流,也不需要它-工作流基础…
  • 似乎没有你想相信的那么多选择;P

    • 那么一个简单的EXE如何执行该任务,并通过Windows任务调度器进行调度?您可以从应用程序内部管理多线程。这将与控制台应用程序一样简单

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

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

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

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


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

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

    查看有关此主题的一些优秀博客帖子:

    WCF是一个强大的通信库,它可以让你从很多麻烦和细节中解脱出来,而这些都是你从头开始创建的


    WCF可以托管在IIS中(尽管有其缺陷),或者您可以将WCF服务插入Windows NT服务,并在机器启动时启动和运行,而不需要任何人登录。

    是否可以签出?它更像是一个调度程序,但您可以在多个线程上启动作业等。我用它代替了Windows服务,取得了巨大成功。

    我建议使用好的ol Windows服务。为了这些目的,我使用C#编写了许多服务。它们可以产生线程,运行一段时间,并且设计得很好,可以做你想做的事情。您可以在Visual Studio中创建.net windows服务。它是.net项目类型之一


    WCS和WCF都可以做您想要做的事情,但需要一些额外的工作,而且实际上并不是为您想要做的事情而设计的。

    这是一个很好的问题,+1和偏好如果您没有尝试在.NET中创建Windows服务,我建议您尝试一下。它实际上并不比控制台应用程序复杂多少,有很多方法可以处理重启和信号发送。您的第一个链接说,“WCF持久服务是WCF服务,其中操作可以记住服务主机和/或客户端重启之间的私有变量值(=服务状态)。”,这很有趣,但不是我需要的。我确实学到了一些新东西。谢谢