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