Windows服务在其他Windows服务功能结束后启动
本文关键字:Windows 启动 结束 其他 服务 服务功能 | 更新日期: 2023-09-27 18:17:43
我有两个windows服务,Service_A和Service_B。假设每个服务中有5个以上的功能。我希望,当Service_A的一个函数完成时,Service_B的一个函数启动。我该怎么做呢?我列出了我想要的步骤
Service_A.function1() ... start
Service_A.function1() ... finish
Service_A.function1() ... triggers Service_B.functionX()
Service_B.functionX() ... start
Service_B.functionX() ... finish
您可以使用EventWaitHandle
来完成此操作。下面是一个使用两个控制台应用程序的简单示例。下面是执行触发的应用程序的代码:
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static EventWaitHandle _event;
static void Main(string[] args)
{
_event = new EventWaitHandle(false, EventResetMode.ManualReset, "foobar");
Func1();
Console.ReadLine();
}
static void Func1()
{
Console.WriteLine("{0} - Func1() Started...", DateTime.Now);
Thread.Sleep(500);
Console.WriteLine("{0} - Func1() Finished..", DateTime.Now);
Thread.Sleep(500);
_event.Set();
}
}
}
下面是被触发的应用程序的代码:
using System;
using System.Threading;
namespace ConsoleApplication2
{
class Program
{
static EventWaitHandle _event;
static void Main(string[] args)
{
_event = new EventWaitHandle(false, EventResetMode.ManualReset, "foobar");
_event.WaitOne();
Func1();
Console.ReadLine();
}
static void Func1()
{
Console.WriteLine("{0} - Func1() Started...", DateTime.Now);
Thread.Sleep(500);
Console.WriteLine("{0} - Func1() Finished..", DateTime.Now);
}
}
}
首先启动ConsoleApplication2,然后启动ConsoleApplication1。
这样做是因为两个应用程序使用相同的命名事件"foobar"。这个名称应该在系统范围内是唯一的,所以您可能需要考虑生成一个GUID并使用它作为名称,例如,"{EEABFFAD-A5CF-4C70-A6C5-CAD7B7AAD004}"。这将避免任何合理的冲突可能性。
请注意,为了使这个示例像您所描述的那样工作,必须首先运行ConsoleApplication2。当您将此应用于服务时,您可能希望构造一些东西,以便哪个服务首先启动无关紧要。这只是防弹的一部分,但需要注意。
还要注意ConsoleApplication2调用WaitOne()
。该函数阻塞,直到事件被触发。如果事件从未被触发,它将永远阻塞。您可能需要考虑将其替换为超时循环,以便您还可以检查服务是否需要关闭。例如,
// Create a 'shutdown' ManualResetEvent in the OnStart() method.
// Set it in the OnStop() method to trigger this thread to stop
// executing.
while (!_shutdownEvent.WaitOne(0))
{
// Wait for 1 second before timing out. If return is true,
// the event was triggered.
if (_event.WaitOne(1000))
{
Func1();
}
}
HTH