2011-04-07 77 views
0

我有两个进程A和B.与Windows的多线程交互EventLog

进程A继续每5秒写入一次EventLogEntry。

进程B应该侦听EventLog对象上的EntryWritten事件,并尽快在屏幕上报告已写入条目。

如何创建应始终运行直到手动关闭的进程B.(exe)。

请参见下面的代码片段:

class Observer 
{ 
    static void Main(string[] args) 
    { 
     EventLog log = new EventLog("logname", "MyMachine", "source"); 

     log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten); 
     log.EnableRaisingEvents = true; 

     // The thread shouldn't exit here but wait till the event is received 
     // When received, should call the handler 
     // and then again keep waiting for next event. 
    } 

    static void log_EntryWritten(object sender, EntryWrittenEventArgs e) 
    { 
     if (e.Entry.Source == "source") 
     { 
      Console.WriteLine("Message " + e.Entry.Message); 
      Console.WriteLine("InstanceId " + e.Entry.InstanceId); 
      Console.WriteLine("Source " + e.Entry.Source); 
      Console.WriteLine("TimeWritten " + e.Entry.TimeWritten); 

      Console.ReadLine(); 
      Console.WriteLine("\n"); 
     } 
    } 
} 

如何能不能做到?

谢谢。

回答

1

您应该删除调用Console.ReadLinelog_EntryWritten处理。否则,你会阻止处理程序。

为避免你的程序马上就得在Main末尾添加以下代码终止:

Console.ReadKey(); 

你的主要THEAD将阻塞,直到一个键被按下控制台上。 EventLog类用于服务EventWritten事件的线程将用于每次新事件到达时执行处理程序。除非你必须学习从Event.EventWritten Event这句话有一些信息,你5秒要求:

的系统响应WriteEntry只有在发生至少六秒钟,最后写事件之前。这意味着即使发生多个事件日志更改,您也只会在6秒内收到一个EntryWritten事件通知。如果在WriteEntry调用之间插入足够长的睡眠间隔(大约10秒),则不太可能错过某个事件。但是,如果写入事件频繁发生,则可能会在下一个时间间隔之前收到事件通知。通常,错过的事件通知不会丢失,但会延迟。

1

你可以尝试一些简单的像这样:

static void Main(string[] args) 
{ 
    EventLog log = new EventLog("logname", "MyMachine", "source"); 

    log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten); 
    log.EnableRaisingEvents = true; 

    //Wait for a key to be pressed. 
    Console.ReadKey(); 
}