2014-02-11 34 views
4

我有一个更新一些报告信息的Windows服务。我可以使用事件在应用程序之间发送信号吗?

我有一些其他应用程序运行在同一台机器上,可以做的事情,导致报告信息更新。

任何一方都不知道对方什么,但我希望能够有应用程序做一些信号,即更新应该发生。

我最初的想法是为应用程序,以提高某种系统范围的事件。他们不知道或在意是否有其他服务正在倾听它的处理。

同时,服务正在侦听该事件,不知道或不关心谁提出的。

我可以用应用程序写入到系统事件日志,服务侦听该日志事件做到这一点....但是这好像它塞满了应用程序事件日志。

是否有另一个更合适,方式来处理呢?

+1

http://msdn.microsoft.com/en-us/magazine/cc163537.aspx#S8 –

+0

@HansPassant如果我正确读取它,它是一个独立的pub/sub服务? – Matthew

回答

3

从中发送消息的应用程序,可以发出一个UDP广播限于上本地机器,并使Windows服务监听该端口。

这样,应用程序并不需要知道Windows服务,反之亦然。他们都是独立的,可以用自己的方式进行部署。

+0

+1这很聪明。我只希望只有发送到本地主机的数据包有很好的可靠性...... – Matthew

1

您可以使用内存映射文件来指示报告进程。下面的例子是从MSDN

提取的第一过程:

class Program 
{ 
    // Process A: 
    static void Main(string[] args) 
    { 
     using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000)) 
     { 
      bool mutexCreated; 
      Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated); 
      using (MemoryMappedViewStream stream = mmf.CreateViewStream()) 
      { 
       BinaryWriter writer = new BinaryWriter(stream); 
       writer.Write(1); 
      } 
      mutex.ReleaseMutex(); 

      Console.WriteLine("Start Process B and press ENTER to continue."); 
      Console.ReadLine(); 

      Console.WriteLine("Start Process C and press ENTER to continue."); 
      Console.ReadLine(); 

      mutex.WaitOne(); 
      using (MemoryMappedViewStream stream = mmf.CreateViewStream()) 
      { 
       BinaryReader reader = new BinaryReader(stream); 
       Console.WriteLine("Process A says: {0}", reader.ReadBoolean()); 
       Console.WriteLine("Process B says: {0}", reader.ReadBoolean()); 
       Console.WriteLine("Process C says: {0}", reader.ReadBoolean()); 
      } 
      mutex.ReleaseMutex(); 
     } 
    } 
} 

和第二处理:

using System; 
using System.IO; 
using System.IO.MemoryMappedFiles; 
using System.Threading; 

class Program 
{ 
    // Process B: 
    static void Main(string[] args) 
    { 
     try 
     { 
      using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap")) 
      { 

       Mutex mutex = Mutex.OpenExisting("testmapmutex"); 
       mutex.WaitOne(); 

       using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0)) 
       { 
        BinaryWriter writer = new BinaryWriter(stream); 
        writer.Write(0); 
       } 
       mutex.ReleaseMutex(); 
      } 
     } 
     catch (FileNotFoundException) 
     { 
      Console.WriteLine("Memory-mapped file does not exist. Run Process A first."); 
     } 
    } 
} 
相关问题