我有两个进程A和B.
进程A每5秒继续写一次EventLogEntry。
进程B应该在EventLog对象上侦听EntryWritten事件,并且ASAP应该在屏幕上报告已写入条目。
如何创建应该一直运行的Process 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");
}
}
}
怎么做?
感谢。
答案 0 :(得分: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();
}
答案 1 :(得分:1)
您应该删除Console.ReadLine
处理程序中对log_EntryWritten
的调用。否则你将阻止处理程序。
为避免您的程序立即终止,您必须在Main
末尾添加此代码:
Console.ReadKey();
主要的thead将会阻塞,直到在控制台上按下某个键。每次新事件到达时,EventLog
类用于为EventWritten
事件提供服务的线程将用于执行处理程序。除了你必须从Event.EventWritten Event学习这个引用,它有一些关于你的5秒要求的信息:
只有在最后一次写入事件发生至少六秒之前,系统才会响应WriteEntry。这意味着即使发生多个事件日志更改,您也只能在六秒间隔内收到一个EntryWritten事件通知。如果在对WriteEntry的调用之间插入足够长的休眠间隔(大约10秒),则不太可能错过事件。但是,如果更频繁地发生写入事件,则可能不会在下一个间隔之前收到事件通知。通常,错过的事件通知不会丢失,但会延迟。