C# windows服务在另一个windows服务功能完成后启动
我有两个windows服务,Service_A和Service_B。假设每个服务中有5个以上的功能。我想,当服务_A的一个函数完成时,服务_B的一个函数启动。我该怎么做?我列出了我想要的步骤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
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例子吗