2014-02-11 70 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."); 
     } 
    } 
} 
相關問題