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

Windows服务在其他Windows服务功能结束后启动

您可以使用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