我是使用Windows Services的新手。尽管我已经学会了在VS2010中创建Windows服务,但是我想知道一些使用Windows服务的实用方法?
我在考虑当前上下文的情况下尝试了谷歌搜索,只是找到了有关如何创建Windows服务的更多教程。
编辑赏金优惠:
所有的答案都很好,但我一直在寻找Windows服务及其含义的更多实际示例?这将帮助开发人员知道何时将其与案例研究一起使用是合适的。
我是使用Windows Services的新手。尽管我已经学会了在VS2010中创建Windows服务,但是我想知道一些使用Windows服务的实用方法?
我在考虑当前上下文的情况下尝试了谷歌搜索,只是找到了有关如何创建Windows服务的更多教程。
编辑赏金优惠:
所有的答案都很好,但我一直在寻找Windows服务及其含义的更多实际示例?这将帮助开发人员知道何时将其与案例研究一起使用是合适的。
Answers:
即使没有人登录到计算机,服务也会在后台运行。您可以想象的任何不依赖他人启动应用程序并单击按钮的操作都是提供服务的理想选择。例如,监视文件夹以及每当将文件写入文件夹时,都以某种方式对其进行处理。您可以想到的任何“服务器”(Web服务器,FTP服务器,邮件服务器)都是一种服务,因此您可能不会经常想到许多后台进程。
曾经写为服务的某些内容(凌晨2点备份文件,凌晨3点发送提醒电子邮件等)今天可以更好地作为计划任务完成,这些任务在Windows 7及更高版本上具有极大的灵活性,但是如果开发人员从未学习过,或者系统必须支持XP,您还会发现执行这些任务的服务。
Windows上的服务基本上是无需GUI即可运行的程序。Web服务器(例如apache),数据库服务器(例如mysql&sql服务器),防病毒引擎和应用程序/“中间件”服务器都是经常作为服务运行的应用程序的实际示例。可能会有GUI客户端允许您与该服务进行交互,但是该服务本身没有。它只是在“后台”运行,完成其任务。此外,由于服务是在分配了用户权限的情况下运行的,因此它们可以作为分配的用户运行用户是否实际上已登录到计算机。因此,与当时登录计算机的人员(如果有)无关,数据库服务器将具有相同的访问权限。因此,您可以看到为什么这很重要-例如,您不想让用户登录才能保持Web服务器的运行。
它们在Windows上(以大多数实用方式)等效于* nix上的守护程序。
服务
一种程序,例程或过程,执行特定的系统功能以支持其他程序,尤其是在较低(接近硬件)级别的情况下。通过网络提供服务时,可以在Active Directory中发布这些服务,从而促进以服务为中心的管理和使用。
我想知道可以使用Windows服务的一些实用方法吗?
根据服务定义,Window Service和其他类型的服务会执行许多功能。在这种情况下,搜索引擎是您的朋友。
当应用程序需要连续运行时,通常使用Windows服务。您应该创建Windows服务,以在后台运行代码,而无需用户交互。
即使没有人登录,Windows服务也会运行。机器加电后,Windows服务就可以开始运行,这非常适合作为服务器(例如http服务器)运行。无需任何人登录。
例如,如果他们需要:
我会出于以下原因使用服务:
您可以免费获得一些内置的管理命令
o开始
o停止
o暂停
o继续
您可以处理服务器事件,例如关机。
链接有关这些服务的其他信息:
在Asp.net- // TODONT:仅使用Windows服务来运行计划的进程
什么是Windows服务
自从您在问题中添加了有关实际示例的注释后,我将为您提供一些我为企业应用程序编写的服务示例(您没有说您是否是企业应用程序程序员,但我想大多数C#VS2010程序员都是) 。我认为您正在寻找对不适合Microsoft的开发人员可能会写些什么的想法。
心跳监视器服务,用于检查其他程序是否仍在运行(这可能也已作为计划任务运行,但已作为服务实现)。
报表编写服务可以处理报表请求的队列,运行报表,然后根据繁忙的打印机将其发送到其他打印机。这有助于从旧版应用程序中分担大量工作,并允许运行该服务的多个廉价设备共享正在运行的报告。
它作为一项服务实现,因此它可以连续运行,在重新启动时自动启动,并能够使用标准的Windows Services界面来启动,停止,暂停等。此外,如果它是计划任务,则需要开始从其他程序或持久性源(队列,文件,数据库)获取数据,而不是供其他程序调用(套接字,管道)。
一个客户端/服务器应用程序的服务器部分也被实现为服务,以便将重启在重新启动后,等有与运行相同程序的.exe另一个项目不作为一种服务,以使其更容易在开发机器上调试。
希望对您有所帮助。不过,其他答案是更好的一般答案,尤其是这样的想法,即对于大多数目的而言,计划任务现在可能更容易编写和管理。
服务有许多实际用途。一个主要的实际用途是UI和服务程序(或UNIX中的守护程序)之间的交互,在这种情况下,这就是客户端和服务器之间的区别。服务器接收请求,处理请求并通常发回答复。换句话说,它服务于一个请求。考虑一下SQLSERVER,IIS或telnet。客户端通常通过向服务器发送请求,然后显示或处理回复来利用服务器。即数据输入应用程序,Web应用程序...服务器几乎总是作为服务安装在Windows中(或Unix中的守护程序),而客户端通常只是带有gui的普通应用程序。服务有许多更复杂的用途,但这可能是您最常使用的一种。
例如:我目前正在SIP / H323视频服务器上工作。它使用我编写的SDK接收来自应用程序的请求,进行处理,然后回复。视频服务器应用程序作为守护程序安装在嵌入式linux机器上(这将是嵌入式Windows机器上的服务,但无论如何仍使用Windows进行嵌入),并且任何使用SDK的应用程序都将视为客户端。
当然,您可以编写此类应用程序而不将其用作服务。您仍然可以使它们在启动Windows时启动,并使它们在后台运行。但是,它涉及一些注册表项和代码中的某些问题-使用c api比.NET之类的操作要容易得多。另一方面,Microsoft通过创建服务并允许我们在OS中注册它们,使此操作变得更加容易。与手动完成相比,它实现起来要简单得多。
候选程序的示例:
必须监视资源/其他应用程序并发送报告(用户活动,特定类型的文件流量,应用程序行为不正常的通知)的系统
为其他本地应用程序提供服务的系统(翻译,文件转换,系统间消息传递)
防毒软件。
我认为这些是使用计划任务无法轻松完成的重要示例。
我最喜欢使用服务的示例:
这是带有真实代码的服务概念的示例用法(如下所示)。
它的作用是配置服务总线,该服务总线消耗掉队列并侦听来自Web服务器和客户端GUI的消息。
当它收到消息时,它将执行域所保证的逻辑,它将事件保存到磁盘,然后将这些事件发布到消息代理。
松散耦合的大多数大型应用程序都实现了某种“工作”架构,例如下面的东西。
Documently项目是一个示例项目,我们为像您这样的人创建了一个示例项目,以学习分布式体系结构。您可以在项目中直接向我提问,也可以分叉它并实现一些功能以向其学习,然后提交请求请求(并获得代码注释)。
https://github.com/haf/Documently/blob/master/src/Documently.Domain.Service/Program.cs:
using System.Threading;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Documently.Infrastructure;
using Documently.Infrastructure.Installers;
using MassTransit;
using Topshelf;
using log4net;
using log4net.Config;
namespace Documently.Domain.Service
{
class Program
{
private static readonly ILog _Logger = LogManager.GetLogger(typeof (Program));
private IWindsorContainer _Container;
private IServiceBus _Bus;
public static void Main(string[] args)
{
Thread.CurrentThread.Name = "Domain Service Main Thread";
HostFactory.Run(x =>
{
x.Service<Program>(s =>
{
s.ConstructUsing(name => new Program());
s.WhenStarted(p => p.Start());
s.WhenStopped(p => p.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("Handles the domain logic for the Documently Application.");
x.SetDisplayName("Documently Domain Service");
x.SetServiceName("Documently.Domain.Service");
});
}
private void Start()
{
XmlConfigurator.Configure();
_Logger.Info("setting up domain service, installing components");
_Container = new WindsorContainer()
.Install(
new RavenDbServerInstaller(),
new CommandHandlerInstaller(),
new EventStoreInstaller(),
new BusInstaller(Keys.DomainServiceEndpoint)
);
_Container.Register(Component.For<IWindsorContainer>().Instance(_Container));
_Bus = _Container.Resolve<IServiceBus>();
_Logger.Info("application configured, started running");
}
private void Stop()
{
_Logger.Info("shutting down Domain Service");
_Container.Release(_Bus);
_Container.Dispose();
}
}
}
前一段时间,我的团队在巴西的一家银行实施了3个Windows服务,如下所示:
系统之间的接口:我们有一个前台应用程序,负责在股票市场上进行交易的预定,还有一个后台应用程序,用于对交易费用进行会计和计算。最初,系统间通信是直接在SQL Server上进行的,但是太多的锁定和保留问题使系统遭受了性能下降的困扰。实施了一项服务,以连接到前后数据库,并使用某种保留策略来进行正确的读取/写入(而不是在SQL Server上写入每笔交易,我们将数据保留一定程度的扩展,例如1000笔交易,以及进行了大容量插入,比原始解决方案快40倍,并且长时间没有锁定许多涉及的表)。
消息队列:与先前的解决方案一起,我们编写了一个自定义消息队列处理程序,因此,多个批处理过程可以异步运行。该产品已与MSMQ和IBM-MQSeries集成在一起。
商业服务的集中化:例如,一些用户应用程序需要通用数据作为股票价格,因此我们编写了一个定制服务,负责接收“价格请求”并发送回价格信息。
导致我们编写服务而不是“机器人”的方面之一是,服务可以作为特定用户运行(正如在该线程上已经指出的那样),并且可以在计算机启动时自动启动。
服务也不需要桌面或窗口管理服务即可运行。它们可以在后台运行(嗯,它们必须在后台运行)。
而且,如果您像我的某些同行一样不喜欢编写用户界面,则服务是巨大的技术挑战,因为通常它们一定不会失败。因此,编写服务非常有趣。:)
如果您设计的Windows桌面应用程序需要以标准用户身份运行,但是有时需要执行需要管理员权限的任务,则可以使用服务。
安装程序会使用所需的权限安装服务,当桌面应用程序需要执行具有管理员权限的任务时,桌面应用程序会调用该服务。
此方法存在安全隐患,超出了此答案的范围。
对于程序员而言,使用服务的主要原因是:
您编写的必须符合上述条件的所有内容都必须作为Windows服务运行。
从最终用户的角度来看,我编写的最有用的服务是:
*用户在带有RAW打印驱动程序的点矩阵打印机上打印了UGLY发票。
*用户需要带有徽标,线条流畅的图形的漂亮发票。
*无法访问旧版代码。
该服务将:
*监视(多个)打印机文件夹中的打印作业。
*创建发票的PDF。
* PDF将“覆盖”一个漂亮的空白发票图像
*覆盖原始文本
*根据使用的文件夹(即使用的打印机)查找元数据,
然后元数据将:
*生成PDF
*和/或打印PDF
*和/或将PDF归档到最终目标文件夹
*和/或删除PDF
*和/或通过电子邮件将PDF发票发送给客户
在这种情况下,它可以处理虚脚本,PLC和PDF引擎。多年来,它一直运行得非常干净。包括日志文件!!!