C# windows服务在另一个windows服务功能完成后启动

C# windows服务在另一个windows服务功能完成后启动,c#,windows-services,C#,Windows Services,我有两个windows服务,Service_A和Service_B。假设每个服务中有5个以上的功能。我想,当服务_A的一个函数完成时,服务_B的一个函数启动。我该怎么做?我列出了我想要的步骤 Service_A.function1() ... start Service_A.function1() ... finish Service_A.function1() ... triggers Service_B.functionX() Service_B.functionX() ... start

我有两个windows服务,Service_A和Service_B。假设每个服务中有5个以上的功能。我想,当服务_A的一个函数完成时,服务_B的一个函数启动。我该怎么做?我列出了我想要的步骤

Service_A.function1() ... start
Service_A.function1() ... finish
Service_A.function1() ... triggers Service_B.functionX()
Service_B.functionX() ... start
Service_B.functionX() ... finish
你可以用它来做这件事。下面是一个使用两个控制台应用程序的非常简单的示例。以下是执行触发的应用程序的代码:

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并使用该名称作为名称,例如“{EEABFAD-A5CF-4C70A6C5-CAD7B7AAD9004}”。这将避免任何合理的冲突可能性

请注意,为了使此示例如您所述工作,必须首先运行ConsoleApplication2。当您将此应用于您的服务时,您可能希望构造一些东西,以便先启动哪个服务无关紧要。这只是防弹措施的一部分,但需要注意

还要注意,ConsoleApplication2调用。此功能将一直阻止,直到触发事件。如果事件从未触发,则它将永久阻止。您可能需要考虑用超时循环替换此项,以便还可以检查服务是否需要关闭。比如说,

// 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

看一看我不知道进程间通信,但在服务之间使用它似乎很困难。服务a.function1()必须触发服务b.functionX()(通过任何IPC机制,只需看一看WCF-这很简单-或者只是一个自动resetEvent)。作为替代方案,您可以设置一个观察者来执行此操作(但服务必须公开适当的事件)。我喜欢IPC,但我不明白如何从IPC中获益。你们能给我举个简单的IPC例子吗