Windows服务vs计划任务

Windows服务与重复运行程序的计划任务(例如,每两分钟)有什么区别?


更新:

我原来的答案差不多四年了,这个答案已经过时了。 由于TopShelf随着Windows服务的发展而变得容易。 现在你只需要弄清楚如何支持故障转移......

原始答案:

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

Windows Scheduler的另一个主要烦恼是交互式运行而不是后台进程。 当在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(Dead Link)

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


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

/ ru SYSTEM

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

编辑

根据您的操作系统和任务本身的要求,使用/ru选项,您可以使用权限低于本地系统的帐户。

从精美的手册中,

/RU username

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

Task Scheduler 2.0可从Vista和Server 2008获得。

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


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

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

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

链接地址: http://www.djcxy.com/p/38907.html

上一篇: windows service vs scheduled task

下一篇: What is the Windows version of cron?