请选择 进入手机版 | 继续访问电脑版

大富翁Delphi开发技术网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2637|回复: 0

[精品文章] C#实现windows服务的管理

[复制链接]

970

主题

1459

帖子

4501

积分

论坛元老

Rank: 8Rank: 8

积分
4501
发表于 2014-6-28 16:13:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
介绍

本文章介绍了C#实现windows服务的管理,在我的电脑上,会有很多应用的安装,例如:数据库、虚拟机等,这些都会占用电脑的内存,那么我们在这些程序不用的时候,可以通过服务管理器将这些服务关闭,但是通过服务管理器,里面服务很多,需要在里面进行查找比较麻烦,所以做了一个小程序,通过XML来配置服务的名称以及是否关闭。

程序是这样的,如果服务已经关闭,那么关闭被禁用,如果服务启动,开启被禁用。

下面是主要的代码

  1. class service
  2. {
  3.     internal string name;
  4.     internal TimeSpan startTimeout, stopTimeout;
  5.     internal bool stopOnly;
  6.     internal static int DefaultStopMs, DefaultStartMs;
  7.     internal service(string name, int stopMs, int startMs, bool stopOnly)
  8.     {
  9.         this.name = name;
  10.         stopMs = (stopMs > 0) ? stopMs : DefaultStopMs;
  11.         startMs = (startMs > 0) ? startMs : DefaultStartMs;
  12.         stopTimeout = new TimeSpan(0, 0, 0, 0, stopMs);
  13.         startTimeout = new TimeSpan(0, 0, 0, 0, startMs);
  14.         this.stopOnly = stopOnly;
  15.     }
  16.    
  17. }
  18. List<service> ssServices = null;

  19.     App.Messenger.Register<string>("InitializeViewModel", (xmlFn) =>
  20.         {
  21.             Status = "Loading";
  22.             using (XmlTextReader xmlReader = new XmlTextReader(xmlFn))
  23.             {
  24.                 XDocument xdoc = XDocument.Load(xmlReader);
  25.                 service.DefaultStopMs = Convert.ToInt32(xdoc.Root.Attribute
  26.                 ("DefaultStopMs") !=null ? xdoc.Root.Attribute
  27.                 ("DefaultStopMs").Value : "100" );
  28.                 service.DefaultStartMs = Convert.ToInt32(xdoc.Root.Attribute
  29.                 ("DefaultStartMs") != null ? xdoc.Root.Attribute
  30.                 ("DefaultStartMs").Value : "100");
  31.                 var services = from serviceItem in xdoc.Root.Elements()
  32.                                select new service(
  33.                                    serviceItem.Value,
  34.                                    Convert.ToInt32(serviceItem.Attribute("StopMs") != null ?
  35.                                    serviceItem.Attribute("StopMs").Value : "-1"),
  36.                                    Convert.ToInt32(serviceItem.Attribute("StartMs") != null ?
  37.                                    serviceItem.Attribute("StartMs").Value : "-1"),
  38.                                    Convert.ToBoolean(serviceItem.Attribute("StopOnly") != null ?
  39.                                    serviceItem.Attribute("StopOnly").Value : "false")
  40.                                    );
  41.                 ssServices = services.ToList();
  42.                 L = ssServices.Count;
  43.                 WindowHeight = 150;
  44.                 Status = "Loaded";
  45.             }
  46.         });
  47.     System.Windows.Input.CommandManager.InvalidateRequerySuggested();
  48. }

  49. // The services are start/stopped in the background worker

  50.     backgroundWorker.DoWork += (s, e) =>
  51.         {
  52.             BackgroundWorker bw = (s as BackgroundWorker);
  53.             stop = (e.Argument as bool?).HasValue ? (e.Argument as bool?).Value : true;
  54.             foreach (service se in ssServices)
  55.             {
  56.                 if (!stop && se.stopOnly)
  57.                 {
  58.                     sleep(displaySleepMS);
  59.                     continue;
  60.                 }
  61.             string exceptionMessage = null;
  62.             bool acted = false;
  63.             ServiceController sc = new ServiceController(se.name);
  64.             ServiceControllerStatus scs = ServiceControllerStatus.Stopped;
  65.             try
  66.             {
  67.                 scs = sc.Status;
  68.             }
  69.             catch(Exception ex)
  70.             {
  71.                 Trace.WriteLine(ex.Message);
  72.             }
  73.             if (scs == (stop ? ServiceControllerStatus.Running : ServiceControllerStatus.Stopped))
  74.             {
  75.                 App.Messenger.NotifyColleagues("setStatus",
  76.                 (stop ? "Stopping " : "Starting ") + se.name);
  77.                 for (int retry = 0; retry < maxRetries; retry++)
  78.                 {
  79.                     try
  80.                     {
  81.                         if (retry > 0)
  82.                             sc = new ServiceController(se.name);
  83.                         if (sc.Status == (stop ? ServiceControllerStatus.Running : ServiceControllerStatus.Stopped))
  84.                             if (stop)
  85.                                 sc.Stop();
  86.                             else
  87.                                 sc.Start();
  88.                         sc.WaitForStatus(
  89.                             stop ? ServiceControllerStatus.Stopped : ServiceControllerStatus.Running,
  90.                             se.startTimeout);
  91.                         acted = true;
  92.                         actedCount++;
  93.                         break;
  94.                     }
  95.                     catch (Exception ex)
  96.                     {
  97.                         if (retry == maxRetries - 1)
  98.                             exceptionMessage = ex.Message;
  99.                         else
  100.                             sleep(1000);
  101.                     }
  102.                 }
  103.             }
  104.             if (exceptionMessage != null)
  105.                 App.Messenger.NotifyColleagues("setStatus",
  106.                 se.name + (stop ? " Stop" : " Start")
  107.                     + " Failed: " + exceptionMessage);
  108.             else
  109.                 if (acted)
  110.                     App.Messenger.NotifyColleagues("setStatus",
  111.                     se.name + (stop ? " Stopped" : " Started"));
  112.                 else
  113.                     App.Messenger.NotifyColleagues("setStatus",
  114.                     se.name + " Already" + (stop ? " Stopped" : " Started"));
  115.                     
  116.             sleep(displaySleepMS);
  117.             if (bw.CancellationPending)
  118.             {
  119.                 e.Cancel = true;
  120.                 break;
  121.             }
  122.         }
  123.         bw.ReportProgress(L);
  124.         sleep(displaySleepMS);
  125.         if (e.Cancel)
  126.             e.Result = "Cancelled";
  127.         else
  128.             e.Result = (stop ? "Stopped " : "Started ") +
  129.             actedCount.ToString() + " Services";
  130.         };
复制代码



转载请保留当前帖子的链接:http://www.dfwlt.com/forum.php?mod=viewthread&tid=916 谢谢!

搜索简单,分享不易,且分享且珍惜,您难道不想分享下您的心得?如果觉得本文章好的话,您可以在我们网站上注册,然后发布您的好的心得,让大家共同进步,谢谢!

最新添加

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

申请友链|Archiver|手机版|小黑屋|大富翁Delphi开发技术网站 ( 苏ICP备12065705号-4

GMT+8, 2019-10-14 20:26 , Processed in 0.099676 second(s), 30 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表