与windows EventLog的多线程交互

本文关键字:多线程 交互 EventLog windows | 更新日期: 2023-09-27 17:49:27

我有两个进程A和b。

进程A保持每5秒写入一次EventLogEntry。

进程B应该监听EventLog对象上的EntryWritten事件,并且ASAP应该在屏幕上报告条目已经写入。

如何创建进程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");
        }
    }
}

怎么做呢?

谢谢。

与windows EventLog的多线程交互

您应该在log_EntryWritten处理程序中删除对Console.ReadLine的调用。否则将阻塞处理程序。

为了避免您的程序立即终止,您必须在Main的末尾添加以下代码:

Console.ReadKey();

您的主标题将阻塞,直到在控制台上按下一个键。EventLog类用于服务EventWritten事件的线程将用于在每次新事件到达时执行处理程序。不过你得研究一下"事件"里的这句话。EventWritten事件,包含有关5秒要求的一些信息:

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

您可以尝试这样简单的操作:

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();
}