.NET中长时间运行的有状态服务

时间:2010-03-11 16:56:58

标签: .net workflow .net-4.0 wcf

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

  • 古老的Windows服务
  • Windows通信服务
  • Windows Workflow Foundation

我真的不知道选哪个。大多数功能都在此服务使用的库中,因此服务本身非常简单。

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

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

对于.NET中有状态,长期运行的服务问题,我非常感谢每个解决方案(或其他我未提及的)的优缺点

谢谢,
阿萨夫

P.S。,
我正在使用.NET 4。

编辑:

  • 主持人“简单地工作”的意思是,例如,我创建的服务如果崩溃就会被重新激活。
  • 我想这个问题的原因是我以前创建了Windows服务(我认为它是使用Win32 API的简单C ++),我不想错过更简单的东西,如果有的话作为事情。

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

编辑2:

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

谢谢,
阿萨夫

6 个答案:

答案 0 :(得分:7)

根据您的描述,您最好的选择是#1,Good Old Windows Service。您可以为其分配工作,它可以根据需要运行,并且可以生成线程。不确定“简单工作”是什么意思,或者为什么Windows服务不能正常运行。

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

WCF本质上是基于Web的远程处理,它本身不处理长时间运行的进程。 Workflow Foundation可以处理长时间运行的工作流,但仅限于此。

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:2)

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

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

WCF是一个功能强大的强大通信库,可以让您从头开始创建所有这些内容时,免除了许多麻烦和细节。

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

  1. 尽可能“简单地工作” - 不包括Windows服务......
  2. 由于不活动而没有被拆除......可怕 - WCF ......
  3. 不需要工作流程,也不需要它 - Workflow Foundation ......
  4. 似乎没有你想要的选项那么多! ; P

    • 通过Windows任务计划程序安排完成工作的简单EXE怎么样?您可以从应用程序内部管理多线程。这就像控制台应用程序一样简单。

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

答案 5 :(得分:0)

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