另一个Windows服务功能完成后,Windows服务启动

时间:2014-08-13 11:32:23

标签: c# windows-services

我有两个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

1 个答案:

答案 0 :(得分:1)

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