2010-03-11 66 views
9

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

  • 好,旧的Windows服务
  • Windows通讯服务
  • Windows工作流基础

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

一方面,服务主机尽可能接近“简单工作”(不包括Windows服务)是非常重要的。另一方面,重要的是不要因为没有外部活动而导致主机取消服务,这会使WCF变得非常“恐怖”。对于WF来说,最强大的卖点就是能够创建流程,这个流程,这是我不需要也不需要的。总结一下,微软的大量技术让我感到有些困惑。

我会很感激有关(我没有提及或其他的)的状态,长时间运行的服务的问题,在.NET

感谢各方案的利弊帮助,
阿萨夫

PS,
我使用.NET 4

编辑:

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

感谢迄今为止的所有回复!
Asaf。

编辑2:

我将使用一个Windows服务,并且可能举办里面一个WCF服务,以允许其他进程与它通信。

感谢,
阿萨夫

+0

这是一个很好的问题+1和偏好的 – 2010-03-11 16:58:30

+1

如果您还没有尝试在.NET中创建Windows服务,我建议您尝试一下。它并不比控制台应用程序复杂得多,并且有很多方法来处理重启和信号。 – 2010-03-11 17:55:27

回答

7

根据您的描述,你最好的赌注是1号,一个很好的旧Windows服务。你可以分配工作,它可以运行,只要你想要的,它可以产生线程。不知道“简单工作”是什么意思,或者说为什么Windows服务不能运行。

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

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

0
  1. 为“简单工作”成为可能 - 这不包括Windows服务...
  2. 没有取下来,由于活动......吓人 - WCF ...
  3. 没有必要的工作流,也不希望它 - 工作流基金会...

看起来没有选择那么多,你想相信它! ; P

  • 如何做一个简单的EXE工作,并通过Windows任务计划程序计划?您可以在应用程序内部管理多线程。这将和控制台应用程序一样简单。

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

3

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

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

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

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

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

2

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

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

WCF是一个强大而强大的通信库,它可以让您从大量麻烦和细节中解放出来,从头开始创建所有这些时你必须处理这些问题。WCF可以托管在IIS中(或所有缺陷),或者您可以将WCF服务粘贴到Windows NT服务中,并在机器启动时启动并运行,而无需任何人登录。

+0

您的第一个链接指出:“WCF持久服务是WCF服务,在这些服务中,操作可以记住在重新启动serivcehost和/或客户端之间私有变量的值(=服务的状态)。”这很有趣,但不是我需要的。我确实学到了一些新东西。谢谢! – 2010-03-12 06:14:30

0

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

1

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

WCS和WCF都会做你想做的事情,但需要一些额外的工作,而且确实没有为你想做的事情设计。