Windows服务不断运行
我创build了一个名为ProxyMonitor的Windows服务,并且当前处于服务安装和卸载阶段,我希望它。
所以我执行这样的应用程序:
C:\\Windows\\Vendor\\ProxyMonitor.exe /install
漂亮的自我解释,然后我得到services.msc
和启动服务,但是当我这样做时,我得到以下消息:
本地计算机上的代理监视器服务已启动,然后停止。 如果没有工作要做,某些服务会自动停止,例如性能日志和警报服务
我的代码如下所示:
public static Main(string[] Args) { if (System.Environment.UserInteractive) { /* * Here I have my install logic */ } else { ServiceBase.Run(new ProxyMonitor()); } }
然后在ProxyMonitor类中我有:
public ProxyMonitor() { } protected override void OnStart(string[] args) { base.OnStart(args); ProxyEventLog.WriteEntry("ProxyMonitor Started"); running = true; while (running) { //Execution Loop } }
和onStop()
我只是将running
variables更改为false
;
我需要做些什么来使服务不断活跃,因为我需要监视我需要跟踪更改的networking。
更新:1
protected override void OnStart(string[] args) { base.OnStart(args); ProxyEventLog.WriteEntry("ProxyMonitor Started"); Thread = new Thread(ThreadWorker); Thread.Start(); }
在ThreadWorker
我有ProxyEventLogger.WriteEntry("Main thread entered")
不会被解雇。
OnStart()
callback需要及时返回,所以你需要启动一个线程来执行所有的工作。 我会build议将以下字段添加到您的类中:
using System.Threading; private ManualResetEvent _shutdownEvent = new ManualResetEvent(false); private Thread _thread;
_thread
字段将保存对OnStart()
callback中创build的System.Threading.Thread
对象的引用。 _shutdownEvent
字段包含一个系统级别的事件结构,用于指示线程在服务closures时停止运行。
在OnStart()
callback中,创build并启动您的线程。
protected override void OnStart(string[] args) { _thread = new Thread(WorkerThreadFunc); _thread.Name = "My Worker Thread"; _thread.IsBackground = true; _thread.Start(); }
你需要一个名为WorkerThreadFunc
的函数才能工作。 它必须匹配System.Threading.ThreadStart
委托签名。
private void WorkerThreadFunc() { }
如果你没有在这个函数中添加任何东西,线程将会启动,然后立即closures,所以你必须在那里放置一些逻辑,这样在你做工作的时候基本上可以让线程继续运行。 这是_shutdownEvent
派上用场的地方。
private void WorkerThreadFunc() { while (!_shutdownEvent.WaitOne(0)) { // Replace the Sleep() call with the work you need to do Thread.Sleep(1000); } }
while循环检查ManualResetEvent
是否“设置”。 由于我们用上面的false
初始化了对象,所以这个检查返回false。 在循环内,我们睡了1秒。 您需要将其replace为您需要执行的工作 – 监视代理设置等
最后,在您的Windows服务的OnStop()
callback中,您要通知该线程停止运行。 这很容易使用_shutdownEvent
。
protected override void OnStop() { _shutdownEvent.Set(); if (!_thread.Join(3000)) { // give the thread 3 seconds to stop _thread.Abort(); } }
希望这可以帮助。
您需要退出您的OnStart
处理程序,以便服务控制器意识到您的服务已经启动。 为了使它像你想要的那样工作,你可以启动一个计时器,它会以一定的时间间隔进行打点,并在打勾时进行处理。
编辑:
尝试在您的OnStart
放置一个System.Diagnostics.Debugger.Launch()来查看发生了什么(并在ThreadWorker
放置一个断点)。 我build议在#if DEBUG
包装这个以确保它不被部署。
我也意识到你不会给你的Thread
一个名字:
Thread myThread = new Thread(ThreadWorker); myThread.Start();
当然不是在OnStart
方法中添加一个while
循环。 这会告诉操作系统该服务没有启动,因为它不能安全地从OnStart
方法中退出。 我通常创build一个在OnStart
方法中启用的Timer
。 然后在Ticks
方法中,我确实调用了必要的方法来获得应用程序的运行。
或者,您可以执行以下操作:
// The main entry point for the process static void Main() { System.ServiceProcess.ServiceBase[] ServicesToRun; ServicesToRun = new System.ServiceProcess.ServiceBase[] { new WinService1() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun); }
有关Windows服务的更多信息,可以在这里获得一个框架示例。
示例代码演示使用控制台应用程序。 希望这会有所帮助..
class Program { private static CancellationTokenSource _cancellationTokenSource; private static ManualResetEvent _shutdownEvent = new ManualResetEvent(false); private static Thread _serviceStartThread; private static Thread _serviceStopThread; private static int workcounter = 0; static void Main(string[] args) { _cancellationTokenSource = new CancellationTokenSource(); _serviceStartThread = new Thread(DoWork); _serviceStopThread = new Thread(ScheduledStop); StartService(); StopService(); } private static void StartService() { _serviceStartThread.Start(); } private static void StopService() { _serviceStopThread.Start(); } /// <summary> /// Triggers a cancellation event for stopping the service in a timely fashion. /// </summary> private static void ScheduledStop() { while (!_shutdownEvent.WaitOne(0)) { if (workcounter == 10) { _cancellationTokenSource.Cancel(); } } } /// <summary> /// Represents a long running Task with cancellation option /// </summary> private static void DoWork() { while (!_shutdownEvent.WaitOne(0)) { if(!_cancellationTokenSource.Token.IsCancellationRequested) { workcounter += 1; Console.Write(Environment.NewLine); Console.Write("Running...counter: " + workcounter.ToString()); Thread.Sleep(1000);//Not needed, just for demo.. } else { Console.Write(Environment.NewLine); Console.Write("Recieved cancellation token,shutting down in 5 seconds.. counter: " + workcounter.ToString()); _shutdownEvent.Set(); Thread.Sleep(5000);//Not needed, just for demo.. } } } }
为什么不在Windows服务types的解决scheme中创build一个新项目? 这设置了您需要实现的所有结构,甚至包括服务启动/停止事件的处理程序。