我正在使用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);
}
}
}
事实是,当服务到达任务管理器/服务时,总是停止,您右键单击并启动,并保持停止状态。
如果计时器工作正常,我只是因为这段代码没有开始? 我可以有这个问题吗?任何想法?问候
答案 0 :(得分:1)
查看OnStart
的文档:
不要使用构造函数来执行应该在OnStart中的处理。使用OnStart处理服务的所有初始化。在应用程序的可执行文件运行时调用构造函数,而不是在服务运行时调用。可执行文件在OnStart之前运行。例如,当您继续时,不会再次调用构造函数,因为SCM已将对象保存在内存中。如果OnStop释放在构造函数而不是OnStart中分配的资源,则第二次调用服务时将不会再次创建所需的资源。
所以听起来你需要在OnStart
而不是构造函数中启动后台工作程序,并在OnStop
中停止它。
您还可以检查事件日志中的异常,和/或添加日志记录以了解是否从服务中抛出异常。