2008-12-23 265 views

回答

3

Windows服务不需要任何人登录,Windows有停止,启动和记录服务结果的功能。

计划任务不要求您学习如何编写Windows服务。

+7

计划任务也可以在用户未登录的情况下运行,但用户的密码必须提供给计划代理。 – 2008-12-23 23:04:56

+1

@moodforaday除非帐号没有配置传递(例如`NT AUTHORITY \ LocalService`或`NT AUTHORITY \ NetworkService`)。任何提供的密码都会被忽略,因为这些帐户没有密码。 – 2013-05-30 15:40:01

10

启动和退出应用程序的开销是多少?每两分钟就是一次。一项服务可能会让系统运行得更顺利,而不是频繁执行应用程序。

这两种解决方案都可以在用户未登录时运行程序,因此在那里没有任何区别。然而,编写服务比普通的桌面应用程序要复杂一些 - 您可能需要一个单独的GUI客户端,它将通过TCP/IP,命名管道等与服务应用程序进行通信。

从用户的POV,我想知道这更容易控制。对于大多数非技术用户来说,服务和计划任务都远不可及,即他们甚至不会意识到他们存在并且可以被配置/停止/重新计划等。

4
  1. 使用正确的权限设置和锁定Windows服务更容易。
  2. 服务更“可见”,意味着每个人(即技术人员)都知道去哪里寻找。
+5

你的第一点也适用于计划任务。 我不确定“更可见”是什么意思。计划任务可以像服务一样方便地查看。 – w4g3n3r 2008-12-30 17:55:40

+0

@ w4g3n3r:大多数技术人员都知道如何查看Windows服务以查看正在运行的内容。此外,如果它是服务(并正在运行),它将显示在正常的任务管理器列表中。很少有人使用计划任务。 – NotMe 2008-12-31 00:05:58

+0

此外,技术人员知道在出现问题时查看事件查看器。计划任务将该信息存储在文件系统上的日志文件中。我愿意打赌大多数人甚至不知道在哪里寻找。 – NotMe 2008-12-31 00:07:24

2

为什么不提供两者?

在过去,我把'核心'位放在一个库中,并且在服务和控制台应用程序中都包含了对Whatever.GoGoGo()的调用。每隔两分钟发射一些东西的几率是不错的,例如只是一个“ping”类型的函数)。包装不应该包含比单个方法调用和一些日志记录更多的内容。

37

更新:后

近四年来我原来的答案,这个答案是非常不合时宜的。由于TopShelf来到Windows服务开发很容易。现在,你只需要弄清楚如何支持故障转移...

原来的答案:

我真的不是Windows计划的粉丝。用户的密码必须在上面指出@moodforall,这在有人更改该用户的密码时非常有趣。

Windows调度程序的另一个主要烦恼是交互式运行,而不是后台进程。当在RDP会话期间每20分钟弹出15个MS-DOS窗口时,您会踢自己,而不是将它们安装为Windows服务。

无论您选择什么,我当然都建议您将处理代码从控制台应用程序或Windows服务中分离出来。然后您可以选择从控制台应用程序调用工作进程并将其挂接到Windows计划程序,或者使用Windows服务。

你会发现调度Windows服务并不好玩。一个相当常见的情况是,您需要定期运行一个长时间运行的进程。但是,如果您正在处理一个队列,那么您确实不希望同一个工作人员的两个实例处理相同的队列。因此,您需要管理计时器,以确保您的长时间运行的进程是否已运行超过指定的计时器时间间隔,直到现有进程完成后才会启动。

写完所有内容后,您会想,为什么我不使用Thread.Sleep?这使我可以让当前线程继续运行,直到完成,然后暂停时间间隔开始,线程进入休眠状态并在需要的时间后再次启动。整齐!

然后你再有很多专家在互联网上阅读所有的意见告诉你如何真的是不好的编程习惯:

http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx

所以你会划伤你的头,你自己想,WTF ,撤消挂起签出 - >是的,我敢肯定 - >撤消所有今天的工作.....该死的,该死的,该死的......

但是,我喜欢这种模式,即使大家都认为它是废话:

单线程方法的OnStart方法。

protected override void OnStart (string args) { 

    // Create worker thread; this will invoke the WorkerFunction 
    // when we start it. 
    // Since we use a separate worker thread, the main service 
    // thread will return quickly, telling Windows that service has started 
    ThreadStart st = new ThreadStart(WorkerFunction); 
    workerThread = new Thread(st); 

    // set flag to indicate worker thread is active 
    serviceStarted = true; 

    // start the thread 
    workerThread.Start(); 
} 

的代码实例化一个单独的线程,重视我们的工人 功能吧。然后它启动该线程,并让OnStart事件 完成,以便Windows不认为该服务已挂起。

单线程方法的工作方法。

/// <summary> 
/// This function will do all the work 
/// Once it is done with its tasks, it will be suspended for some time; 
/// it will continue to repeat this until the service is stopped 
/// </summary> 
private void WorkerFunction() { 

    // start an endless loop; loop will abort only when "serviceStarted" 
    // flag = false 
    while (serviceStarted) { 

     // do something 
     // exception handling omitted here for simplicity 
     EventLog.WriteEntry("Service working", 
     System.Diagnostics.EventLogEntryType.Information); 

     // yield 
     if (serviceStarted) { 
     Thread.Sleep(new TimeSpan(0, interval, 0)); 
     } 
    } 

    // time to end the thread 
    Thread.CurrentThread.Abort(); 
} 

为单螺纹的方法调用OnStop方法。

protected override void OnStop() { 

    // flag to tell the worker process to stop 
    serviceStarted = false; 

    // give it a little time to finish any pending work 
    workerThread.Join(new TimeSpan(0,2,0)); 
} 

来源:http://tutorials.csharp-online.net/Creating_a_.NET_Windows_Service%E2%80%94Alternative_1%3a_Use_a_Separate_Thread(死链接)

我一直在运行许多Windows服务这样的多年,它为我工作。我还没有看到人们同意的推荐模式。只要做一些适合你的工作。

13

这里有一些错误信息。 Windows调度程序能够完美地在后台运行任务,无需弹出窗口并且无需密码。在NT AUTHORITY \ SYSTEM帐户下运行它。使用此schtasks的开关:

/RU结构

但是,是的,用于访问网络资源,最好的做法是用一个单独的非过期密码策略服务帐户。

编辑

根据您的操作系统和任务本身的要求上,你可以使用账户比本地系统特权较少与/ru选项。

从细manual

/RU username 

A value that specifies the user context under which the task runs. 
For the system account, valid values are "", "NT AUTHORITY\SYSTEM", or "SYSTEM". 
For Task Scheduler 2.0 tasks, "NT AUTHORITY\LOCALSERVICE", and 
"NT AUTHORITY\NETWORKSERVICE" are also valid values. 

Task Scheduler 2.0可从Vista和Server 2008的

在XP和Server 2003,system是唯一的选择。

7

在.NET开发中,我通常通过开发一个控制台应用程序,这将运行开始将所有日志输出到控制台窗口。但是,只有控制台应用程序与命令参数/console一起运行时才是。当它没有这个参数运行时,它就像一个Windows服务,它将继续运行在我自己的自定义编码计划定时器上。

Windows服务,我脑海里,通常用于管理其他应用,而不是成为一个长期运行的应用程序。或者..他们连续运行重要的应用程序,如SQL Server,BizTalk,RPC连接,IIS(即使IIS技术上卸载工作到其他进程)。个人而言,我喜欢通过Window Services为重复性维护任务和应用程序(如文件复制/同步,批量电子邮件发送,文件删除或归档,数据更正(当其他解决方法不可用时))等应用程序执行计划任务。

对于一个项目我都参与了8个或9 Windows服务的发展,但这些围坐在内存中,闲置,吃20MB或每个实例更多的内存。计划任务将完成其业务,并立即释放内存。

7

这个词“serv'ice股共同之处与” serv'er。预计将始终运行,并“服务”。任务是一项任务。

角色扮演。如果我是另一个操作系统,应用程序或设备,并且我打电话给一个服务,那么我预计它会运行,我期望得到回应。如果我(操作系统,应用程序,开发人员)只需要执行一项孤立的任务,那么我将执行一项任务,但如果我期望进行通信,可能需要双向沟通,我需要一项服务。这与两件事情交流的最有效方式或想要执行单个任务的单一事件有关。

然后是调度方面。如果你想在某个特定的时间运行某些东西,安排。如果你不知道什么时候需要它,或者需要“即时”服务。

我的回答在本质上更具哲理性,因为这与人与人之间的互动和工作方式非常相似。我们越了解通信艺术,“实体”了解他们的角色,这个决定就变得越容易。除了所有的理念,当你“快速成型”时,正如我的IT部门经常做的那样,为了维持生计,你必须做任何事情。一旦原型设计和概念证明不受阻碍,通常在早期规划和发现阶段,就必须决定哪些是长期可持续性更可靠的。

好的,所以最后,它高度依赖于很多因素,但希望这提供了洞察力而不是混淆。

1

这是一个老问题,但我想分享我面临的问题。

最近我被要求捕获雷达截图(来自气象网站),并每10分钟将其保存在服务器中。

这需要我使用WebBrowser。 我通常制作windows服务,所以我决定也做这一项服务,但它会一直崩溃。 这是我在事件查看器 错误模块路径看到:C:\ WINDOWS \ SYSTEM32 \ Mshtml.dll的

由于任务是紧迫的,我有非常少的研究和实验的时候,我决定用一个简单的控制台应用程序,并将其作为任务触发并顺利执行。

我真的很喜欢Mark Ransom接受的答案中推荐的article by Jon Galloway

最近服务器上的密码发生了更改,但未对我进行确认,并且所有服务都无法执行,因为它们无法登录。 因此,人们在文章中声称这是一个问题。我认为Windows服务可能面临同样的问题(如果我错了,请纠正我,我是一个新手)

此外,如果使用任务调度程序窗口弹出或控制台窗口弹出。 我从来没有面对过。它可能弹出,但至少非常瞬时。

0

Windows服务需要更多的耐心,直到完成。 它有点困难的调试和安装。它是不露面的。 如果您需要每秒,每分钟或每小时完成的任务,您应该选择Windows Service。

计划任务快速发展,并有一张脸。 如果您需要每天或每周的任务,则可以使用计划任务。