与Windows EventLog的多线程交互

时间:2011-04-07 14:46:56

标签: c# multithreading event-log

我有两个进程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");
        }
    }
}

怎么做?

感谢。

2 个答案:

答案 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秒),则不太可能错过事件。但是,如果更频繁地发生写入事件,则可能不会在下一个间隔之前收到事件通知。通常,错过的事件通知不会丢失,但会延迟。