在C#中实现的Windows服务无法在任务管理器/服务

时间:2015-12-01 22:34:11

标签: c# .net visual-studio-2010 c#-3.0

我正在使用C#,Visual Studio 2010 IDE实现Windows服务。

我首先尝试使用定时器写一个小应用程序,每隔5秒写一个文件,并且工作正常。良好的服务,一切都开始了。

在此测试之后,我需要的是创建一个写入文件的服务"输入USB存储器"和"删除USB内存"。我记录了进入记忆的次数。

这是我的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.IO;
using System.Management;
using System.Threading.Tasks;
using System.Threading;

namespace Test
{
      public partial class Service1 : ServiceBase 
      {   
        System.Timers.Timer tim = null;     
        public Service1()
        {
            InitializeComponent();
            backgroundWorker1.RunWorkerAsync();
            /* tim = new System.Timers.Timer();
            tim.Interval = 5000;
            tim.Elapsed += new ElapsedEventHandler(tim_Elapsed); */ 
        }

        /*void tim_Elapsed(object sender, ElapsedEventArgs e)
        {
            TextWriter text = new StreamWriter(@"C:\log.txt", true);            
            text.WriteLine(DateTime.Now.ToString());
            text.Close();               
        }   */

        private void WriteFile(string que)
        {
            TextWriter text = new StreamWriter(@"C:\log.txt", true);
            text.WriteLine(que);
            text.Close();  
        }

        protected override void OnStart(string[] args)
        {
            tim.Start();          
        }

        protected override void OnStop()
        {
            tim.Stop();
        }

        private void DeviceInsertedEvent(object sender, EventArrivedEventArgs e)
        {
            ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
            foreach (var property in instance.Properties)
            {
                Console.WriteLine(property.Name + " = " + property.Value);
            }
            WriteFile("USB memory is entered");
        }

        void DeviceRemovedEvent(object sender, EventArrivedEventArgs e)
        {
            ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
            foreach (var property in instance.Properties)
            {
                Console.WriteLine(property.Name + " = " + property.Value);
            }
            WriteFile("remove USB memory");
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");

            ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
            insertWatcher.EventArrived += new EventArrivedEventHandler(DeviceInsertedEvent);
            insertWatcher.Start();

            WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
            ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
            removeWatcher.EventArrived += new EventArrivedEventHandler(DeviceRemovedEvent);
            removeWatcher.Start();            
            System.Threading.Thread.Sleep(20000000);
        }
    }
}

事实是,当服务到达任务管理器/服务时,总是停止,您右键单击并启动,并保持停止状态。

如果计时器工作正常,我只是因为这段代码没有开始? 我可以有这个问题吗?任何想法?问候

1 个答案:

答案 0 :(得分:1)

查看OnStart的文档:

  

不要使用构造函数来执行应该在OnStart中的处理。使用OnStart处理服务的所有初始化。在应用程序的可执行文件运行时调用构造函数,而不是在服务运行时调用。可执行文件在OnStart之前运行。例如,当您继续时,不会再次调用构造函数,因为SCM已将对象保存在内存中。如果OnStop释放在构造函数而不是OnStart中分配的资源,则第二次调用服务时将不会再次创建所需的资源。

所以听起来你需要在OnStart而不是构造函数中启动后台工作程序,并在OnStop中停止它。

您还可以检查事件日志中的异常,和/或添加日志记录以了解是否从服务中抛出异常。